pax
POSIX.1-2001フォーマット(pax)に少し対応しました。
tar_file.hppの差分
これもGNUフォーマットと同様に偽のファイルを使って拡張ヘッダを表現しています。
元となるustarフォーマットを扱うクラスをustar_file_sourceとして分離し、gnuとpaxはそのラッパーとして実装するよう変更しました。
これに伴い、tar_file_sourceのコンストラクタではnext_entry()を呼ばなくなりました。
つまり、
do { // ... } while (tar.next_entry());
として使っていたところが、
while (tar.next_entry()) { // ... }
になります。(lzh_file_sourceも同様に変更)
このほうが空のアーカイブを表現できる利点もあります。
paxの拡張ヘッダは、
"%d %s=%s\n", <length>, <keyword>, <value>
が連続する構造です。<length>は、それ自身と末尾の改行を含んだ長さです。
<length>をチェックする必要があるわけですが、ustar_file_sourceはInputSeekableではないのでseek()でオフセットの計算はできません。
面倒ですが一旦、文字列として読んでからパースするようにしています。
こういうのいつも力技でパースしてしまうんですが、C++的にはどうやるのがいいんでしょうねぇ。Boost.Spirit?