Iostreams

SeekableDevice

SeekableSourceかつSeekableSinkなコンセプトを追加しようとして困りました。 Boost.IostreamsだとSeekableDeviceになるんですけど、自分は別の意味(フィルタでないシーク可能なもの)で既に使っていました。 意味が違うと紛らわしいので、Boost.Iostreamsに…

ファイルへの追記

Hamigaki.Archiversの追記サポートが中途半端なままだったので再開です。 追記の場合、ほとんどのフォーマットと読み書き両用でファイルを開く必要があるため、まずは準備としてfile_sinkとfile_sourceをまとめたfileクラスを追加しました。 <hamigaki/iostreams/device/file.hpp> 同様にfile_des</hamigaki/iostreams/device/file.hpp>…

SeekableSink

今日もドキュメントの整備です。 以前にも書きましたが、BoostBookはテンプレート仮引数の名前がコンセプト名と一致する場合、自動でリンクを張ってくれます。 テンプレート仮引数に適切な名前を与えるだけで、その型に対する制約を示すことができ、非常に便…

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の制…

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>…

.gz/.bz2対応

archive/extractサンプルを.gz/.bz2に対応させました。 archive.cppの差分 extract.cppの差分 結局、.gzはアーカイブクラスにはなりませんでした。 特に、ヘッダにファイル名が含まれない場合、アーカイブのファイル名から元のファイル名を推測する仕様がア…

gzip_params::file_name

archive.cpp/extract.cppで.gz(.tar.gzではない)を扱えるようにしようと思って、いろんなアーカイバの動きを調べていたんですが、展開時になぜかファイル名が復元されてびっくりしました。 gzipの仕様を確認したところ、ファイル名、コメント、最終更新時間…

続 暗号化ZIPの復号

昨日のバージョンではInfo-ZIPで暗号化したZIPが読めなかったので修正しました。 raw_zip_file.hppの差分 zip_file.hppの差分 Info-ZIPがZIP仕様書と違う出力をするのには訳があります。 ZIP仕様書では、 32ビット×3個の鍵を用意(固定値) パスワードの各文字…

暗号化ZIPの復号

暗号化ZIPの復号に対応しました。 raw_zip_file.hppの差分 zip_file.hppの差分 サンプルの差分 Cのライブラリなんかだと、パスワードが必要になった時に呼ばれるコールバック関数を設定できるようになっていることが多いと思いますが、コールバック関数の呼…

tbz2_file_source

extractを調整中です。 tar.gzやtar.bz2はよく使うので、ラッパークラスを用意しました。 <hamigaki/iostreams/device/tbz2_file.hpp> <hamigaki/iostreams/device/tgz_file.hpp> tar.bz2の短縮形は、日本のアーカイバを見る限りtbzが多いようですが、Wikipediaのbzip2のページやJakarta CommonsのVFSではtbz2になっているので、クラス名にはこ</hamigaki/iostreams/device/tgz_file.hpp></hamigaki/iostreams/device/tbz2_file.hpp>…

extractor

現状のヘッダーのまま、試しにラッパーを被せてインタフェースを統一して、簡単な展開プログラムを作ってみました。 extract.cpp フォーマットはlzh/zip/tar/tar.gz/tar.bz2/tgz/tbzに対応しています。 ヘッダの情報はこれにまとめました。 // TR2のものとほ…

ヘッダ悩み中

ヘッダフォーマットの統一を考えています。 LZH/ZIPはDOS寄り、tarはUNIX寄りなので、どうしても拡張ヘッダが他方の環境で無駄にみえてしまいます。 もう少しマルチプラットフォームなフォーマットはないかと考えて、ISO 9660のCD-ROMイメージファイルを調べ…

ZIPのシンボリックリンク

Info-ZIP形式のシンボリックリンクに対応しました。 zip_file.hppの差分 Info-ZIP形式では、tarの@LongLinkのようにリンク先の情報がファイルの内容として出力されます。 本当はraw_zip_fileとzip_fileの上にもう一段階ラッパーを作ったほうが素直なコードに…

ヘッダの比較

エクストラ・フィールドとrewind_entry()を実装しました。 raw_zip_file.hppの差分 zip_file.hppの差分 まだ足りない機能もありますが、とりあえずは完成です。 ZIPができたので、LZH/tar/ZIPのヘッダを比較してみました。 プロパティ\形式 LZH(Lv2) tar(pa…

zip_file_sink

zip_file_sourceでセントラル・ディレクトリを参照するように修正しました。 raw_zip_file.hppの差分 zip_file.hppの差分 zip_file_sinkも一気に作成してしまいました。 raw_zip_file.hppの差分 zip_file.hppの差分 エクストラ・フィールドにはまだ対応して…

zip_file_source作り直し

data descriptorの仕様を再度確認したところ、 (Note: PKZIP version 2.04g for DOS only recognizes this bit for method 8 compression, newer versions of PKZIP recognize this bit for any compression method.) と書かれていて、deflate以外でもdata d…

zip data descriptor

raw_zip_file.hppをコミットし忘れていたので差分が見れないんですが、拡張タイムスタンプヘッダとInfo-ZIP新UNIXヘッダに対応しました。 <hamigaki/iostreams/device/raw_zip_file.hpp> さて、多くのアーカイバは圧縮イメージの前にヘッダを持っていて、そこにはファイル名や元のファイルサイズ、圧縮イ</hamigaki/iostreams/device/raw_zip_file.hpp>…

zip_file_sourceのdeflate

zip_file_sourceにmethod=8(deflate)の展開処理を追加しました。 zip_file.hppの差分 zlib_decompressorに処理を渡すだけで簡単に対応できました。拍子抜けです。 注意点は、zlibのヘッダがいらない(deflateにチェックサムを付加したのがzlibフォーマット)の…

zip_file_source実装開始

今日はZIPフォーマットの資料を集めて、無圧縮zipの読み込みまで実装しました。 <hamigaki/iostreams/device/zip_file.hpp> ヘッダ構造体はまだ適当です。 LZHともtarとも違う形式ですが、それらを統一するか、なんらかの抽象化を行うかは未定です。 3つのフォーマットを実装してみれば、方向性も決</hamigaki/iostreams/device/zip_file.hpp>…

pax for tar_file_sink

pax形式での出力にも対応しました。 ustar_file.hppの差分 tar_file.hppの差分以前書いたとおり、paxの拡張ヘッダのフォーマットは、 "%d %s=%s\n", <length>, <keyword>, <value> です。 出力時に面倒くさいのは<length>が、それ自身を含むことです。 例えば、"%s=%s\n"の部分が8バイトの"ke</length></value></keyword></length>…

tar_file_sink

ustar形式とGNU形式での出力を実装しました。 ustar_file.hppの差分 tar_file.hppの差分 pax形式の出力はまだ実装していません。 GNU tarの既定フォーマットがgnuであること TAR32.DLLがpax形式に対応していないこと を考慮して、既定フォーマットはgnuにし…

pax

POSIX.1-2001フォーマット(pax)に少し対応しました。 tar_file.hppの差分 これもGNUフォーマットと同様に偽のファイルを使って拡張ヘッダを表現しています。 元となるustarフォーマットを扱うクラスをustar_file_sourceとして分離し、gnuとpaxはそのラッパー…

@LongLink

GNU形式のtarにある程度対応しました。 tar_file.hppの差分 変更点: 負のtime_tに対応(1970/01/01 00:00:00+00:00より昔は負になります!) デバイスファイル以外のメジャー番号とマイナー番号をパースしない @LongLinkを使った100バイト以上のファイル名、リ…

tar_file_source

今度はlzh_file_sourceと同じインタフェースでtarファイルを扱うクラスを作っています。 読み込みのみ実装できました。 <hamigaki/iostreams/device/tar_file.hpp> tarファイルの仕様は日本工業標準調査会のJIS X3030(POSIX.1)を参照して書いてのですが、規格が既に古いようでcygwinのtarで作成したフ</hamigaki/iostreams/device/tar_file.hpp>…

std::streampos

lzh_file.hppのヘッダI/Oを書き換えるつもりでしたが、面倒くさくなってやめました。 代わりにseek関連の処理をまとめました。 <hamigaki/iostreams/seek.hpp> 多くの32ビット環境ではstd::streamoffが32ビットですが、std::streamposはそれ以上の精度を持っていることがあります。 そのた</hamigaki/iostreams/seek.hpp>…

blocking_read

整数型のバイナリ読み書きが煩雑だったのでbinary_io.hppに追加しました。 binary_io.hppの差分 ついでにブロッキングI/Oの関数を追加しました。 <hamigaki/iostreams/blocking.hpp> 基本の処理として、 template<class Source> struct blocking_reader { typedef typename boost::iostreams::char_type_of<Source>::</source></class></hamigaki/iostreams/blocking.hpp>…

restrictとseek()

とりあえす、LZHのLevel 0/1ヘッダーをサポートしました。 <hamigaki/iostreams/device/lzh_file.hpp> 仕様の確認などにも手間取って、LZHUFの組み込みまではできていません。 Level1ヘッダの実装中にboost::restriction::seek()の戻り値が変なことに気が付きました。 最初はバグかと思ったのですが、</hamigaki/iostreams/device/lzh_file.hpp>…

lzh_file_source (無圧縮版)

CRCのチェックと無圧縮(lh0形式)のファイルの読み出しを実装しました。 <hamigaki/iostreams/device/lzh_file.hpp> lzh_file_source自体は書庫中のエントリを辿って、解凍(LHA用語)後のデータを読み出す機能しかありません。 各エントリをファイルシステム上にどう展開するかはライブラリユーザー次第</hamigaki/iostreams/device/lzh_file.hpp>…

LHA書庫を読む

新たなネタ(実際にはライブラリのネタのネタ)としてBoost.IostreamsでLHA書庫ファイルの読み書きをやってみます。 ZIPは誰かやってそうなのでLHAです。 ヘッダの仕様は、 http://homepage1.nifty.com/dangan/Content/Home.html あたりを参考にしています。 …