# -*- Mode: text ; Coding: euc-japan -*-

autoconfiscated for LHa for UNIX version 1.14i
			Mon, Jul 29 2002 by Koji Arai <jca02266@nifty.ne.jp>

このファイルはLHa for UNIX version 1.14i をautoconf、automake化
した(autoconfiscate と言うそうです。Jargon 参照)ときのメモです。

LHa for UNIX に関しては岡本継男さんのページ
  <http://www2m.biglobe.ne.jp/~dolphin/lha/lha.htm>
を参照してください。

※ この版はまだβ版です。十分にテストされていません。もちろん
   無保証なので自己責任で使用してください。

・マクロの置き換え

  オリジナルのlha-1.14i で使われていたマクロはautoconf標準のマクロ名に
  置き換えられました。(IFNAMESファイルに詳細が書かれています)

  IFNAMESファイルは、
     マクロ名 定義のあるファイル...  コメント
  という構成になっています。このファイルはautoconfと一緒に配布される
  ifnamesコマンドの出力を元にしました。
  IFNAMESファイルの# で始まっている行は該当のマクロが置き換えられたり、
  configure コマンドのコマンドオプションで指定されるようになったことを
  示します。そのままの行はautoconfで判断する必要がないかまたは私が判断
  できないため、そのまま放置したことを示します。

・コンパイルの手順

  コンパイルの手順は以下のようになります。

    tar xvzf lha-114i.tar.gz
    cd lha-114i
    patch -p1 < ../lha-1.14i-autoconf.diff

    sh ./configure
    make
    make check
    make install

  MinGW 対応はα版です。ほとんどテストされていません(make check が成功
  する程度)。Cygwin 環境で MinGW 版を試すには

    sh ./configure CC='gcc -mno-cygwin'
		--build=i686-pc-mingw32
		--with-tmp-file=no

  などとしてください。

  autoconf/automake がインストールされている場合で、lha ソースや 
  configure.ac, Makefile.am をメンテナンスする場合は以下の手順になりま
  す。autoconf/automake のバージョンはそれぞれ autoconf 2.5x, automake
  1.6.x 以降での利用を前提としています。

    tar xvzf lha-114i.tar.gz
    cd lha-114i
    patch -p1 < ../lha-1.14i-autoconf.diff

    aclocal
    automake -a
    autoheader
    autoconf
    sh ./configure
    make
    make check
    make install

・-lh6-, -lh7- メソッドのアーカイブ作成

  lha 1.14i では、SUPPORT_LH7の定義をせずにコンパイルした場合、-lh6- 
  および -lh7- メソッドのアーカイブを作成できませんでした。このことは
  別に構わないのですがSUPPORT_LH7を定義するとデフォルトで-lh7-メソッド
  のアーカイブ作成を強制されてしまいます。そこで、もう少し柔軟にlha利
  用者がこれらを選択できるようSUPPORT_LH7は常に定義するようにし、デフォ
  ルトで作成されるアーカイブのメソッド指定をconfigureオプションの 
  --with-default-method=[567] で指定できるようにしました。

  このオプションの省略値は -lh5- です。つまりデフォルトでは -lh5- アー
  カイブを作成します。(そして、上で述べた通り、lhaの o6 または o7 オプ
  ションによりいつでも-lh6-、-lh7- アーカイブを作成でき、configureオプ
  ションによりデフォルトの挙動を変更することができます)

・アーカイブ中の漢字ファイル名

  オリジナルのLHa for UNIX はアーカイブに格納するファイル名の漢字コー
  ドに関して無頓着です。コンパイル時に MULTIBYTE_CHAR を定義したときでも
  アーカイブ中のShift JISファイル名をEUCにすることもなく、EUCコード
  のまま(正確にはシステムの漢字コードのまま)アーカイブに格納したりします。

  autoconf版では、configure オプション --enable-multibyte-filename に
  より漢字ファイル名が使用でき、アーカイブに格納されるファイル名の漢字
  コードを SJIS 固定として扱います。

  --enable-multibyte-filename の引数(システムのファイル名の漢字コード
  指定)は、以下の通りです。

      --enable-multibyte-filename=sjis
	    システムの漢字コードを SJIS として扱います。
      --enable-multibyte-filename=euc
	    システムの漢字コードを EUC として扱います。
      --enable-multibyte-filename=utf8
	    システムの漢字コードを UTF-8 として扱います。
	    今のところ Mac OS X でだけこのオプションをサポートします。
      --enable-multibyte-filename=auto (または yes または引数なし)
	    システムの漢字コードを自動で判別します。自動といっても現状は、
	    Cygwin, MinGW, HP-UX の場合に SJIS、Mac OS X の場合 UTF-8、
	    それ以外を EUC とみなすだけです。
      --enable-multibyte-filename=no
      --disable-multibyte-filename
	    ファイル名のマルチバイトサポートを無効にします。

  デフォルトは、auto です。

  将来的には lha のコマンドラインオプションや環境変数によりアーカイブ、
  システムの各漢字コードを指定できるようにするかもしれませんが、今のと
  ころ実装はしていません。

  Mac OS X 用の utf8 <-> sjis 変換は、2002/6 に坂井浩人さんに作成して
  いただきました。ありがとうございます。

・標準入力からの展開ファイルの指定

  オリジナルのLHa for UNIX は、

    echo foo.txt | lha x foo.lzh
    find bar -name '*.[ch]' | lha c bar.lzh

  とすると、foo.lzh から foo.txt だけを展開したり、bar ディレクトリ配
  下のファイルを bar.lzh に格納したりできます。つまり、標準入力から、
  圧縮／展開ファイルを指定できる機能なのですが、いまいち使い道がないわ
  りに邪魔な機能です(圧縮の例は、cpio 同様まあ使えるけど、このためのオ
  プションを新設するのが良いと考えています)

  tty からの利用しか想定してないと思われますが、おそらく daemon から 
  lha を実行する場合などで意図しない動作をするでしょう。そういうわけで
  勝手ながらこの機能は削除しました。以下のような事ができない Windows 
  環境では意味のある機能だったかもしれませんが

    lha x bar.lzh `echo foo.txt`

  残念ながら MinGW で isatty() がうまく動作しませんでしたから Windows 
  では使えないのでした。

  オリジナルの仕様を復活させたい場合は、lharc.c の 360行目付近の #if 0 
  を #if 1 にしてください。

・拡張ヘッダ(ユーザ名/グループ名)のサポート

  ユーザ名、グループ名の拡張ヘッダ(0x52, 0x53)を作成できるようにしまし
  た(デフォルトはoff)。詳細は header.doc.euc を参照してください。展開
  と一覧表示のときにヘッダにこの情報があれば ID に優先してこの情報が利
  用されます。作成は configure オプション --enable-user-name-header を
  指定して build した場合に有効になります。

・header.c の書き換え

  header.c の主要部分は作り変えられました。上記に示した変更に加えて
  オリジナル lha 1.14i から以下の不具合が修正されました。

    o level 2 header のバグ

      長いファイル名を格納するなどにより total header size (アーカイブ
      ヘッダの先頭 2 byte) が 256 以上になるときに不正なアーカイブが作
      成されていました。特にヘッダ仕様としてヘッダ先頭が 0 になること
      は避けなければならない点が考慮されていませんでした。

    o level 1 header のバグ

      ファイル名に対して拡張ヘッダを使用することがないため、230 バイト
      を越えるファイル名(パス名ではない)をアーカイブに書く際に不正なアー
      カイブが作成されていました。

    o level 0 header のバグ

      長いパス名に対して不正なアーカイブが作成されていました。
      (autoconf 版では制限を越えたパス名は warning メッセージを出力し、
      パス名を切り詰めます)

      空の(ディレクトリ名情報のない) -lhd- ヘッダが作成されていました。

	$ mkdir foo
	$ lha c0 foo.lzh foo
	$ lha v foo.lzh
	 PERMSSN    UID  GID    PACKED    SIZE  RATIO METHOD CRC     STAMP          NAME
	---------- ----------- ------- ------- ------ ---------- ------------ -------------
	drwxrwxr-x  1000/1000        0       0 ****** -lhd- 0000 Jul 29 00:18 
	---------- ----------- ------- ------- ------ ---------- ------------ -------------
	 Total         1 file        0       0 ******            Jul 29 00:18

      なお、level 0 header で -lhd- method は使えないという説がある

        http://kuwa.omosiro.com/x68k/KGARC/ARC/LHAHED15.ZIP

      のですが、オリジナル lha (ver 2.55, 2.67) などは -lhd- method を 
      level 0 header で作成します。

    o g オプションを付けたときの level 0, 1, 2 header

      g オプションは、アーカイブ作成のとき UNIX 固有の情報をアーカイブ
      に作成するのを抑止すると man にはあるのですが、実際にはディレク
      トリ情報まで抑止されていました。

	$ mkdir foo
	$ touch foo/bar
	$ lha cg1 foo.lzh foo
	$ lha foo.lzh 
	 PERMSSN    UID  GID      SIZE  RATIO     STAMP           NAME
	---------- ----------- ------- ------ ------------ --------------------
	[generic]                    0 ****** Jul 29 00:02 bar
	---------- ----------- ------- ------ ------------ --------------------
	 Total         1 file        0 ****** Jul 29 00:02

      autoconf 版では上記は foo/bar になります。(オリジナルはわざとそ
      うしていたのかもしれませんが、そうする理由はないと判断しました)
      g オプションで -lhd- の作成が抑止されるのは同じです。

      なお、g オプションとヘッダレベルの指定を同時に行うときは上記のよ
      うに g オプションを先に指定する必要があります。(lha c1g など) g 
      オプションを後に指定すると level 0 header が作成されます(このオ
      リジナル仕様はちょっとわかりにくいです)。
