tar_file_source

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

があるようです。
JIS X3030に載っているのは、この中では"ustar"に当たります。
最低限、GNU tar既定の"gnu"と最新のPOSIX仕様である"posix"はサポートしないと使い物にならない感じです。


LZHアーカイブの中に圧縮イメージを格納するのと違い、tarはアーカイブのみで圧縮はgzip/bzip2等で行います。
そして、Boost.Iostreamsには既にgzipとbzip2のフィルタが存在します。
これらを組み合わせるだけで、tar.gzやtar.bz2を扱うことができます。

// gzip圧縮されたファイルを読むSource
typedef io::composite<
    io::gzip_decompressor,
    io_ex::file_source
> file_type;

// tar.gzを読むSource (10/15修正: バイナリモードに変更)
io_ex::basic_tar_file_source<file_type> tgz(
    io::compose(
        (io::gzip_decompressor()),
        io_ex::file_source("a.tar.gz", std::ios_base::binary)
    )
);

う〜ん、今試したら途中でgzip errorになってしまいました。
まだ、どこかバグっているっぽいです。

↑ストリームをバイナリモードに設定するのを忘れてました。