2006-01-01から1年間の記事一覧

file_descriptor.hpp

64ビットシークのため、<boost/iostreams/device/file_descriptor.hpp>の改良版を作りました。 <hamigaki/iostreams/device/file_descriptor.hpp> file_descriptor.cpp とりあえずコンパイル通しただけで、全然テストしてません。 最初はヘッダだけで済ませようと似非windows.hを作成していたのですが、UNIX用の実装でマクロ_LARGEFILE64_SOURCEを定義して</hamigaki/iostreams/device/file_descriptor.hpp></boost/iostreams/device/file_descriptor.hpp>…

64ビットseek

ZIPの4GB超ファイルサポートを実装しようと思って、7-ZIPで6.8GBほどのZIPファイルを作成し、試していたのですが、4GB超のシークがまともに動くSourceがないことに気が付きました。 hamigaki::iostreams::file_source →オフセットがlongの範囲まで(fseekの制…

version made by

ZIPヘッダに入れる作成時のシステムの番号(version made byの上位バイト)を定数にしようと思って、OSの正式名称やらなんやらをWikipediaで調べていたら、あっという間に時間が過ぎてしまいました。 Wikipediaのリンクを辿りだしたら切りがないですね。 struc…

zip_test

zip_fileもHamigaki.Archiversに移動しました。 ヘッダの構成を弄っただけで、中身はほとんど変わっていません。 合わせてdelete_zipサンプルと簡単なテストも追加しました。 delete_zip.cpp zip_test.cpp zip_crypt_test.cppSF.jpとは別にローカルに作業用S…

エントリのシーク

LHMelt等のGUIアーカイバでは、書庫中のファイルを一覧表示し、ユーザーが選択したファイルのみを取り出すことができます。 LZHの構造上、一覧表示をするためにはアーカイブ全体を読む必要があるものの、各エントリのオフセットを覚えておけば、そのオフセッ…

skip()

昨日から書いていたヘッダパース処理の整理とシークできないデバイスの対応をしました。 <hamigaki/archivers/detail/lzh_header_parser.hpp> raw_lzh_file_source_impl.hppの差分 シークできないデバイスに対応するため、seek()をskip()で置き換えました。 boost::iostreams::skip()を使いたいところですが、</hamigaki/archivers/detail/lzh_header_parser.hpp>…

Wii届きました

周りに買わないと言っておきながら、買ってしまいました。 社長インタビュー読んで「買わねば」と思った次第です。 ソフトは「はじめてのWii」、「Wii Sports」、「ゼルダ」の3本です。 ずっと対戦していたので、ゼルダはほとんど進んでません。 「はじめて…

Level2ヘッダのサイズ

LZHヘッダの処理を手直ししていてバグを見つけました。 raw_lzh_file_sink_impl.hppの差分 raw_lzh_file_source_impl.hppの差分 LZHファイルは終端に1バイトのヌル文字(エンドマーク)を使います。 逆に言えば、ヘッダの1バイト目はヌル文字であってはいけま…

auto_min

Boost.Iostreamsを弄っていると、std::streamsizeとstd::size_tの値を共に使用する場面に遭遇します。 特に小さいほうの値を選択するmin()操作はよく出てきます。 class hoge_source { public: std::streamsize read(char* s, std::streamsize n) { BOOST_AS…

fpos

Level0/1ヘッダのシンボリックリンク書き出しに対応しました。 raw_lzh_file_sink_impl.hppの差分 CodeWarriorでコンパイルできず気が付いたのですが、std::fposはデフォルトコンストラクタがないんですね。(27.4.3.2) VCやg++だと、デフォルトコンストラク…

Subversionへ移行

SF.jpのSubversionの試験サポートが始まったのでCVSから移行してみました。 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/hamigaki/trunk/?root=hamigaki プロジェクトページのリンクがCVSのままなので、しばらくはCVSも更新します。 移行時のSVN属性に関…

append_lha

LZHファイルの追記サンプルを作成しました。 append_lha.cpp lhaサンプルとほぼ同じですが、初期化の部分だけ違います。 io_ex::file_sink file; try { // 読み書き(truncなし)でオープンを試みる file.open(argv[1], std::ios_base::binary|std::ios_base::…

Level1ヘッダの出力

Level1ヘッダの出力も実装しました。 raw_lzh_file_sink_impl.hppの差分 圧縮/解凍のサンプルも移行完了でバッチリ、と思ったんですが、Cygwinでコンパイルエラー。 namespace hamigaki { namespace archivers { namespace lha { namespace unix { struct gi…

Level0ヘッダの出力

Hamigaki.Archiversにファイルをコピーして、Level0ヘッダの出力を実装しました。 lha::headerに追加したフィールドlevelでヘッダの形式を選択できます。 raw_lzh_file_sink_impl.hpp Hamigaki.Iostreamsからの移行途中なので、古い実装も残っています。 ま…

SHA-1

ちょっと寄り道でHamigaki.ChecksumにSHA-1を追加しました。 <hamigaki/checksum/sha1.hpp> テストコード 最初、RFCに載っているテストケースを読み違えていて、"a"のハッシュ値を計算していました。 本当のテストケースは、"a"を1000000個繋いだ文字列でした。 同じ勘違いをした人もいる</hamigaki/checksum/sha1.hpp>…

delete_lha

raw_lzh_file_sourceとraw_lzh_file_sinkを使って、LZHファイルからエントリを削除するプログラムを作ってみました。 #include <hamigaki/iostreams/device/raw_lzh_file.hpp> #include <boost/filesystem/convenience.hpp> #include <boost/filesystem/operations.hpp> #include <boost/iostreams/copy.hpp> #include <clocale> #include <exception> #include…</exception></clocale></boost/iostreams/copy.hpp></boost/filesystem/operations.hpp></boost/filesystem/convenience.hpp></hamigaki/iostreams/device/raw_lzh_file.hpp>

エントリの削除

アーカイブからエントリを削除する操作は、実際には残すエントリだけ他のファイルにコピーすることです。 削除するエントリをファイル名で指定する場合、最低限必要なヘッダ情報は、 ファイル名 エントリサイズ(圧縮サイズ) の2つです。 これらが基本ヘッダ…

Wii Sports

http://wii.com/jp/movies/sports-03-jp-a/ 思わずディスプレイに向かって拍手してしまいました。

Hamigaki.Archivers

ごちゃごちゃしてきたので、アーカイバ関連のコードをHamigaki.Archiversとして分離させようと思います。 (複数形なのは多分archiverというクラスを作るため) 最初は単にファイルを移動するだけにしようと思っていたのですが、行き当たりばったりに作ってき…

\WINDOWS\SYSTEM32\CONFIG\SYSTEM

友人から \WINDOWS\SYSTEM32\CONFIG\SYSTEM が壊れたとの連絡を受け、 http://support.microsoft.com/kb/436927/ja に従って修復を試みたところ、見事に失敗しました。 XPのロゴが出た後、メッセージボックスが出てすぐにリブートするようになり、回復コンソ…

VistaでDanteWinが動かない件

「Windows Vista アプリケーションの互換性検証と対応ポイント」を見て、「今頃各社Vista対応で大変そうだなぁ」などと考えていたのですが、他人事ではありませんでした。 今更ながら、Vista RC1で拙作「Dante98 for Windows」を試してみたところ、ブルース…

change_attributes()

結局、「ファイル属性=MS-DOSファイル属性」、「ファイル許可属性=POSIXパーミッション」と割り切ることにしました。 元に戻っただけですね。 これに合わせ、file_mode()はchange_attributes()とchange_permissions()に分離しました。 file_status.cppの差分…

ドキュメント追加

Hamigaki.Filesystemのドキュメントも作成しました。 http://hamigaki.sourceforge.jp/libs/filesystem/ 長いこと書いてなかったので、BoostBookのタグをかなり忘れていました。 書いていて気が付いたこと。 「ファイル属性」と「ファイル許可属性」を並べて…

remove_all()

ファイル/ディレクトリを再帰的に削除する関数remove_all()を追加しました。 operations.hppの差分 Boost.Filesystemにもありますが、こちらはWindowsのリパースポイントに対応しています。 久々にテストも追加しました。 remove_all_test.cpp status_test.c…

シンボリックリンクのターゲットを消す方法

DeleteFile If the path points to a symbolic link, the symbolic link is deleted, not the target. To delete a target, you must call CreateFile and specify FILE_FLAG_DELETE_ON_CLOSE. なるほど。 ターゲットを消したい状況が思いつきませんけど。

change_symlink_owner()

ファイルの属性、時間、オーナーを変更する関数を追加しました。 file_status.cppの差分 extract.cppの差分 これで、extract.cppも#ifdefの分岐がなくなりました。 簡単な説明、デザインの論拠とかを書いておきます。 // ファイルの属性とパーミッションを変…

acl_dump

なんとかACLからCygwinっぽいパーミッション情報を引き出すことができました。 ただ、実際に使ってみるとあまり甘みがないことが分かり、ボツになりました。 例えばWindowsのホームディレクトリをCygwinで見ると、 $ ls -ld /cygdrive/c/Documents\ and\ Set…

argv[0]

Binary Hacksがようやく届き、ざっと目を通しました。 HACK#64の「実行中のプロセスのパス名をチェックする」を読んで、実行中に実行ファイルを移動したらどうなるのかと思い、試してみました。 まずは、Linux。(ファイル移動の時間稼ぎのためgets()が入って…

パーミッションとACL

Hamigaki.Filesystemをarchiveサンプルに組み込んでみました。 archive.cppの差分 これで一応、#if defined(BOOST_WINDOWS)がなくなりました。 file_statusも少し変更しました。 file_status.hppの差分 file_status.cppの差分 file_attributesにread_onlyを…

create_symlink()

ハードリンクとシンボリックリンクの作成関数を追加しました。 symlink.cppの差分 id:y-hamigaki:20061110 に書いたとおり、Vistaのシンボリックリンクはファイルとディレクトリで別物なので、それぞれcreate_file_symlink()とcreate_directory_symlink()を…