bbpink近況

<- ゾイゾイゾイゾーイ2 - メイン - X JAPAN復活!!? ->

D言語でシャキーン4

さて4回目となりましたD言語で遊ぼうのコーナー。
プログラミングに興味がない人にとってはどうでもいい記事だと思います。
見てる人がいたら「bbキモイ色死ね!」とコメントしてね!

この前までの問題点は…
・D言語の実行ファイルではシフトJISの文字列を引数にとれない
 これはwindowsが標準でシフトJISを扱う仕様であることと、D言語が標準でUTF-8を扱う仕様であることが原因です。
 これをやっちゃうと「invalid UTF-8 sequence」とかいうエラーが出てメイン関数のしょっぱなで弾かれます。
 ゆえに日本語ファイル名を引数にとると処理をすることすらなくエラーでて終了です。致命的です。

これを改善するのが至上命題でした!!!
そこでグーグル先生に聞いてみたら… 既にやってる人がいました。
このサイトを参考にしてがんばってみました。ありがとうございます。

いじったのは…

dmd/src/phobos/win32.mak
dmd/src/phobos/internal/dmain2.d

で、上のサイトを参考にして新たに作成したのは…

dmd/src/phobos/std/mbs.d

です。

上記サイトに書いてあったmbs.dのソースではmakeできなかったので、
・strlen関数を通すためにimport文を追加
・MultiByteToWideChar関数とMultiByteToWideChar関数の型が間違ってたのでそれぞれに.ptrを追加
しました。
そんでもって
make -f win32.mak
make -f win32.mak install
したらmbsがライブラリに加わったらしく使えるようになってて、dmain2.dも通りました。
これにより!dの実行ファイルではinvalid~が出なくなったのです!!!うれしいわ!!

そこで今回のソースは

bbzipAlpha.d

import std.string;
import std.zip;
import std.file;
import std.mbs;
import std.stdio;

import std.windows.charset;

void main(char[][] args){

if (!isZip(args[1][])) {
//compress
ZipArchive comp = new ZipArchive();
ArchiveMember am1;
for (int i=1;i < args.length; i++) {
addArchiveMember(args[i][], comp, am1);
}
write(replaceExtension(args[1][]), comp.build());
}
else {
//extraction
char[] zipname = getFilename(args[1][]);
byte[] data = cast(byte[])read(args[1][]);
ZipArchive archive = new ZipArchive(data);
mkdir(getcwd() ~ '/' ~ getZipname(zipname));
chdir(getZipname(zipname));
foreach (ArchiveMember am; archive.directory) {
char name[] = mbs2utf(am.name.ptr);
mkdirs(name);
if(name[name.length-1]!='/'){
mkdirs(name);
ubyte[] out1 = archive.expand(am);
//write(getcwd() ~ '/' ~ toString(std.file.toMBSz(name)), out1);
write(getcwd() ~ '\\' ~ "aaa.zip", out1);

//write(name, out1);
}
}
chdir("..");
}
}

void addArchiveMember(char[] member,ZipArchive zip, ArchiveMember am) {

if (isdir(member)) {
getFilename(member);
member ~= '/';
char[][] flist = listdir(member);
for (int i=0; i < flist.length;i++) {
addArchiveMember(member ~ flist[i][], zip, am);
}
}
else {
am = new ArchiveMember();
am.name = toString(std.file.toMBSz(getFilename(member)));
am.expandedData = cast(ubyte[])read(member);
am.compressionMethod = 8;
zip.addMember(am);
}
}
char[] replaceExtension(char[] filename) {

int dot = rfind(filename, '.');

if (dot == -1) {
return filename ~ ".zip";
}
else {
filename.length = dot;
return filename ~ ".zip";
}
}

char[] getFilename(char[] argument) {

int hasdir = rfind(argument, "\\");

if (hasdir == -1) {
return argument;
}
else {
char[] filename = argument[hasdir+1 .. argument.length];
return filename;
}
}

bool isZip(char[] filename) {

int dot = rfind(filename, '.');

if (dot == -1) {
return false;
}
else {
char[] extension = filename[dot+1 .. filename.length];
if (extension == "zip")
return true;
else
return false;
}
}

void mkdirs(char[] dir) {
char[][] s = split(dir,"/");
char[] dirs="";
for (int i=0;i if(s[i] != ""){
dirs = dirs ~ s[i] ~ "/";
try{mkdir(dirs);}catch(Exception e){}
}
}
}

char[] getZipname(char[] filename) {

int dot = rfind(filename, '.');
char[] name = filename[0 .. dot];
return name;
}

チラっとこの前言ったように、圧縮機能は完成!!
ファイル名にかかわらず、zip形式での圧縮が可能となりました!!!
これはうれしいですねー。このままver1.00としてリリースしたいくらいです。
でも展開ができないんですよねー。
デバッグのために意味わからないコードが書いてありますけど気にしないでね。
原因はなんだろう… ディレクトリの展開はうまくいってるみたい?なので
展開するファイルのパス?とかがおかしいのかも… 円マークとスラッシュの使い分けが出来てないんでしょうか…
まあここまで来たらあと一息さ!!

D言語
2007/02/09 17:12:21 comment(0) trackback(0)

コメントを書く

トラックバックURL

follow bbpink at http://twitter.com

タグ

  • 1984-1985
  • 84ism
  • AI2かいこうどう
  • ANTIAN
  • AOI
  • D言語
  • NTR
  • aaaa
  • bbbest1
  • bbblog
  • bbアンテナ
  • debug
  • frf08
  • metamo
  • mp3
  • team84
  • ああ言えばfor you
  • あの日から、6年
  • あの素晴らしい俺をもう一度
  • いつまでβ
  • いつ完成するの
  • いつ完成するの?
  • いやになるほど健康だ
  • この瞬間、世界の中心は間違いなく俺
  • これは余興や
  • しいたけ
  • どういうwhy
  • どうでも永年私財法
  • はい!よろこんで!
  • アルフォートが無いフォート
  • ウメザワン
  • エクセル将軍
  • カメラ
  • ゲーム
  • サブ☆カル
  • サーバメンテナンス
  • スピルカをドンズドン
  • ダム
  • チェンオンリーでやれ
  • ティンホイッスル
  • テンションカチ上がり
  • トド
  • ドキドキ、ワクワク
  • ドム4
  • ドラマーエンカウント率は異常
  • ニコニコ動画
  • ノマド
  • ハゲ
  • バスケ
  • ブサカル
  • ブラック
  • ブログ
  • プログラミング
  • モテ期
  • ヤァマン
  • ヤーマン×bbpink
  • リアルリア充
  • リア充
  • リア充実
  • ログハウス
  • ロン
  • ワザ、ワザ
  • 中学時代のマシンから
  • 人生オワタ\(^o^)/
  • 仮死
  • 休憩必要
  • 俺がセリヌンティウスだったら
  • 偽リア充
  • 充血
  • 冬休み
  • 判子は買わん
  • 動き出せ
  • 勝負パンツ
  • 墓場まで持っていく話
  • 夏
  • 夏休み
  • 大学時代の再来
  • 女心研究チーム
  • 寝坊
  • 島
  • 思い出ボッシュート
  • 思い出復活祭
  • 怨嗟
  • 意外と余裕
  • 我慢マン
  • 掃除しんなん
  • 料理
  • 日曜
  • 日焼け
  • 日記
  • 昔
  • 春
  • 時給0円
  • 暗黒聖闘士
  • 暴走
  • 最終鬼畜妹フランドール・S
  • 歯医者
  • 殺す気か
  • 決意
  • 泣きボクロ活躍
  • 涙が出た
  • 物欲
  • 現実
  • 現実投資
  • 病弱、病弱ゥ!
  • 目が死んでる
  • 砂を噛む
  • 秋
  • 紙がない
  • 総括
  • 考えごと
  • 聖闘士には一度見た技は通用しない
  • 腐ったミカン
  • 血まみれ
  • 見んでいい
  • 金曜
  • 音楽
  • 黄金週間

最近の記事

  • 愚かなハンバーグたちよ、今こそ立ち上がるのです
  • ハンバーグ堕天使打点王
  • ハンバーグばくばくバーン様
  • 憎らしパイナップル
  • 贅沢ピアノロール
  • お誂え向きのデスティニー大根
  • 養豚場スカイドライブ2
  • 散々太陽さんさん33
  • 究極のアーモンドユーザーの声
  • あきらめなさい

昔の記事

  • 2012
    • 2012/02 (2)
    • 2012/01 (9)
  • 2011
    • 2011/12 (9)
  • 2010
    • 2010/12 (2)
    • 2010/09 (1)
    • 2010/05 (1)
    • 2010/04 (1)
    • 2010/03 (1)
    • 2010/02 (2)
    • 2010/01 (2)
  • 2009
    • 2009/12 (2)
    • 2009/11 (3)
    • 2009/10 (4)
    • 2009/09 (1)
    • 2009/08 (11)
    • 2009/07 (3)
    • 2009/06 (7)
    • 2009/05 (4)
    • 2009/04 (9)
    • 2009/03 (31)
    • 2009/02 (3)
    • 2009/01 (7)
  • 2008
    • 2008/12 (6)
    • 2008/11 (4)
    • 2008/10 (9)
    • 2008/09 (7)
    • 2008/08 (3)
    • 2008/07 (5)
    • 2008/06 (4)
    • 2008/05 (4)
    • 2008/04 (14)
    • 2008/03 (6)
    • 2008/02 (7)
    • 2008/01 (6)
  • 2007
    • 2007/12 (15)
    • 2007/11 (7)
    • 2007/10 (7)
    • 2007/09 (18)
    • 2007/08 (22)
    • 2007/07 (25)
    • 2007/06 (20)
    • 2007/05 (19)
    • 2007/04 (16)
    • 2007/03 (4)
    • 2007/02 (26)
    • 2007/01 (21)
  • 2006
    • 2006/12 (22)
    • 2006/11 (33)
    • 2006/10 (29)
    • 2006/09 (27)
    • 2006/08 (14)
    • 2006/07 (25)
    • 2006/06 (21)
    • 2006/05 (28)
    • 2006/04 (28)
    • 2006/03 (31)
    • 2006/02 (39)
    • 2006/01 (26)
  • 2005
    • 2005/12 (8)
    • 2005/11 (24)
    • 2005/10 (13)
    • 2005/09 (27)
    • 2005/08 (19)
    • 2005/07 (30)
    • 2005/06 (31)
    • 2005/05 (30)
    • 2005/04 (9)
    • 2005/03 (30)
    • 2005/02 (24)
    • 2005/01 (29)
  • 2004
    • 2004/12 (28)
    • 2004/11 (33)
    • 2004/10 (29)
    • 2004/09 (25)
    • 2004/08 (30)
    • 2004/07 (31)
    • 2004/06 (18)

オススメリンク

  • bbpink余興
  • ssbbpink's fotolife
  • ssbbpink at last.fm
  • ラインを読め!!!
  • KF4 Check Terminal

powered by bbblog 0.999

Copyright (C) 2009 Sevensenses, All Rights Reserved.