[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00532] Re: FDclone 2.08e has been released



 しらいです。

In Message-Id <20060727162035.0DDC540C128@yuka.unixusers.net>
        Takashi SHIRAI <shirai@unixusers.net>writes:
>  しらいです。

>  本日 fj.sources に FDclone 2.08e の patch を投稿しましたの
> でご案内申上げます。full package は以下の URL で順次公開され
> ていくと思います。

 今回の revision up は 2.09 直前の 2.08 系最後の総決算にな
ります。

 やはり新たな機能を幾つも実装しようとすると、改めて source
を見直す箇所が多くなり、その分見つかる bug も増えてここ数週
間での bug fix が結構溜ってしまいました。
 実は 2.09 はもうほぼ完成していて、後は document 類の整備を
残すのみなんですが、今回差分が非常に多くなってしまったので、
bug fix 分だけを先に 2.08e として release します。

 以下、恒例ですが変更点の解説です。


> 	カスタマイザの ANSIPALETTE 項目をメニュー化。
> 	カスタマイザの PTYMENUKEY 項目をキー入力による設定に変更。

 2.09 では多数の機能追加を行なった訳ですが、その中で manual
に載らない程度の微細な仕様変更を先取りして持って来ました。
 この二つのカスタマイザ項目は、従来はどちらも文字列入力形式
で設定させていたのですが、抽象化されたキーワードによる設定で
はやはり判りにくいと思ったので、直観的な設定方法に改めました。

 前者は、まず色を変えたい属性を選び、続いて変えたい色を選ぶ
ことで、palette の変更したい部分だけを変更するようになります。
まとめて変更するにはむしろ不便ですが、そういう方は普通に変数
値を変更して下さい。
 後者は、キー名の代わりにキーそのものの打鍵により設定するよ
うになります。キー名を忘れてもキー自体を忘れることはないので、
所望のキーを指定するのが楽になると思います。


> 	カスタマイザで EDITOR, PAGER 等の内部変数を設定できるよう修正。

 これも上と同じ理由で 2.09 から先取りした変更です。なので、
manual には載りません。
 manual を読むと「SORTTYPE」とか「DISPLAYMODE」とかいった他
の変数と全く同列に「EDITOR」や「PAGER」が載ってるんですが、
実は内部処理は微妙に違います。
 前者が予め何らかの C の変数に変換しておいてから処理される
のに対し、後者は使う時に初めて値を参照して使われます。後者は
そんなに複雑な処理を要求されないからです。
 しかし、だからと言ってカスタマイザで変更出来ないという理屈
は利用者には伝わりませんから、これも対象に含めることにしまし
た。
 追加されたのは、「EDITOR」「PAGER」の他、「SHELL」「FDEDIT」
「COMSPEC」の五つです。但し「COMSPEC」は MS-DOS 環境のみです
が。
 これでカスタマイザで設定出来ないのは manual に「*」付で載
っている「FD_ を冠して使えない」変数だけですね。これらの変数
は純粋に shell 用なので。

 このついでと言っては何なんですが、これまで「SHELL」の値し
か参照していなかった箇所でも「FD_SHELL」の値を優先的に参照す
るように改めてます。
 manual 読むと「SHELL」は「FD_」付の変数名が無効な部類に属
すと書いてあるんですが、実際「FD_SHELL」の方を見ている箇所も
あったので、全部「FD_SHELL」有効にしました。


> 	SORTTYPE の設定が即座に反映されない点を修正。

 SORTTYPE の値が 100 未満の時には、カスタマイザやコマンドラ
インで SORTTYPE の値を変更すると即座にソート形式が変更されま
す。
 ところが 100 以上の時には変更されません。これは「直前の値
を保持する」という仕様を忠実に実装したためで、値を変更する前
の「直前の値」を保持した結果です。

 しかし、考えてみると実際に SORTTYPE を変更するような局面で
は、ソート形式も同時に変更して貰った方が嬉しいことの方が多い
ように思えて来ました。
 なので、仕様には忠実でないかも知れませんが、SORTTYPE を変
更した場合には「直前の値を保持する」設定であっても、ソート形
式を「直前の値」ではなく「今設定した値」に設定することにしま
した。
 これ、どのタイミングで変更されるか判らないので、対応は結構
面倒なんですけどね。


> 	sparc64 環境で異常終了する点を修正。

 sparc64 は一例に過ぎず、big endian の 64bits 環境で普通に
起こっていた症状です。sizeof(char *) が sizeof(int) よりも大
きくなっちゃうんですね。
 この辺りの話は既に [FDclone-users:00199] 辺りでも指摘され
てうるのですが、続く [FDclone-users:00200] ではしれっと「問
題ありません」と言い切ってしまっていますね。

 char * として用意された領域に int 値を格納する時、(char *)
と cast することで char * 幅の整数値として格納されます。これ
を int として引出すとどうなるかという問題。
 sizeof(char *) <= sizeof(int) の時は大した問題はないのです
が、sizeof(char *) > sizeof(int) の時には、領域の前半部しか
参照されないという点に着目すべきです。
 little endian 環境では領域の前半部がちょうど int 領域と同
じ形式になりますが、big endian 環境では領域の後半部が int 領
域と同じになるので、前半部は全く違う値になってしまいます。

 なので、起動直後にこの char * 領域を確認して、この状況に陥
るような環境では予め領域の後半部を前半部に移動させておくとい
う対処を行ないました。
 因みに、union 値の初期化では、C99 では {.a = 10} のように、
gcc では {a: 10} のように、どの共用体要素に対する代入なのか
を明示的に指定可能です。
 でも、可搬性の問題もあるので、こういう compiler 依存の実装
は避けました。


> 	PTYMODE=1 時に UTF8 環境でカーソル位置がおかしくなる点を修正。

 PTY では文字数を数えながらカーソル移動しないとカラム位置が
合わなくておかしくなります。
 Shift JIS 環境だと文字数とカラム数が等しいのですが、例えば
EUC-JP 環境ではいわゆる半角カナが 2bytes で 1 カラムなので、
半角カナかどうかを見ながら数える必要があります。
 このことは UTF-8 にも言えて、こちらの場合半角カナは 3bytes
もあるんですね。このことを忘れていたために半角カナ文字を入力
していくとカーソルの実位置と仮想位置がずれてしまっていました。


> 	書込み権のないディレクトリコピー/移動に失敗する点を修正。

 当たり前の話ですが、書込み権のない directory の下には何も
作成することは出来ない訳で、書込み権のない directory をその
ままの permission でコピーなり移動なりしちゃうと、その下層部
分を全くいじることが出来なくなっちゃいますね。
 それで失敗していたので、まずは書込み権ありで directory を
作成してから、中身を移した後で元の permission に戻す実装に改
めました。

 実は cp(1) や mv(1) の実装だと書込み権のない directory 相
手には失敗する実装が多いんですよね。なので、これは仕様だと言
ってしまっても良かったのですが、不便なので直しました。
 但し、削除の場合は書込み権がなければ失敗するようにしてあり
ます。これは rm(1) の実装に合わせたと言うよりは、その方が安
全だからです。書込み禁止ってことはそういう意志の表れですし。


> 	ドライブ名を冠したファイル名補完に失敗していた点を修正。

 ここで言う「ドライブ名」とは「c:」等の MS-DOS 形式のパス名
表記のことですが、この修正点は二つの複合する bug に起因して
います。
 一つは 2.08b で「:」を command line delimiter にしたのが原
因で、もう一つはそもそもドライブ名を冠した current directory
表記に対応していなかったのが原因です。

 パス名補完では、カーソル位置から command line delimiter が
現れるまで遡って、それ以降をパス名と見なして補完候補を探しま
す。
 この delimiter に 2.08b から「:」を加えました。これは rsh
等の流儀で host:/path/to/file のように記述することがあるため
で、このこと自体はそう悪い話ではなかったと思います。
 ところが、例えば「C:/TMP」のような command line 文字列がパ
ス名として見なされず「/TMP」の部分だけ切り離されてしまってい
ました。
 なので、ドライブ名の形を取っている部分は delimiter と見な
さない仕様に改めています。

 もう一つは「c:tmp」のように path delimiter の「/」を一切含
まない表記への対応です。この例のような表記は MS-DOS の流儀で
は「c:./tmp」の略記になります。
 彼の文化ではドライブ毎に current directory を持つので、ド
ライブ名の後ろを相対パス表記にすると、そのドライブの current
directory からの相対パスになるんですね。
 ところが、「c:./tmp」では正しく補完出来るのに「c:tmp」では
これまで補完候補が全く存在しませんでした。directory「c:」を
参照しようとして失敗していた訳です。
 なので、「c:tmp」表記は「c:./tmp」と見なして補完を行なうよ
うに実装を改めました。


> 	SFN 表記のディレクトリタイムスタンプ変更失敗を修正。(MS-DOS 版)

 SFN というのは MS-DOS のいわゆる 8+3 形式のファイル名表記
のことです。
 Windows の API にはこの 8+3 形式用の API と、255 文字まで
のファイル名を表せる LFN 形式用の API とが、独立して存在しま
す。
 このうち、directory の timestamp を変更出来るのは LFN 用の
API のみで、実は SFN 用 API は directory の timestamp を変更
出来ないんですね。
 その証拠に、素の MS-DOS 向けアプリである本家の『FD』には、
directory の timestamp 変更機能がありません。

 FDclone も「MS-DOS 版」というスタンスなのでこれに倣っても
構わないとは思うのですが、LFN 用 APL を持つ環境では、折角変
更出来るのに敢えて変更しないという理屈はありませんよね。
 なので、SFN 用 API で timestamp 変更に失敗した際には、LFN
用 API も試すようにしました。当然、LFN 用 API を持つ Windows
環境以外では無理なんですけどね。


 あとは HISTORY に書いていない些細な変更点を幾つか。書いて
いないと言うより、細か過ぎて簡単に一言では言い表せないので、
面倒だし書かなかったというのが正解かも。

 まず一つ。USEDATADIR を設定した場合に使用される directory
の既定値を /usr/local/share から /usr/local/share/fd に変更
しました。
 これは単にそういう流儀が多いみたいだったのでそうしただけの
ことなので、それが気に入らない場合は make 時に DATADIR の値
を元に戻して下さい。

 もう一つは NetBSD 3.1 への対応です。まだ正式 release は出
ていませんけど。
 NetBSD 3.1 では <sys/disklavel.h> に「MSDOS」とか「SYSV」
とかいう識別子が定義されてて、これが FDclone の定義と見事に
衝突します。
 NetBSD 側でこれを回避する pre-define 識別子が用意してある
ので、これを使うことにしました。

 ついでに一つ。非常に反応の鈍い端末環境で USEGETCURSOR=1 に
してしまうと、カーソル位置応答の escape sequence が遅延して
ゴミ入力になってしまうことがあります。
 これは待ち時間を十分に設けることで解消出来ますが、どれだけ
待ったところで、想定以上に鈍い環境ではやはり取りこぼしが生じ
てキー入力にゴミが混入してしまいます。
 escape sequence の取得を終了した時点で入力を flush してる
んですが、その後に入力が無くなるまでキー入力を取得し続けるこ
とで、少なくともゴミ入力は無くなりました。
 相変わらず escape sequence の取得に失敗するのは防ぎ切れな
いんですけどね。

 更に一つ。directory 移動の際に途中で intr キー入力により中
断したり、他の何らかの理由に理由により移動が完了しなかった場
合、カーソル位置がずれてしまう現象を直しました。
 移動が完了すれば元のカーソル位置にあった directory は無く
なる筈なので、カーソル位置をその次に移動させておくという作法
があるんですが、これを中断時にも行なってしまっていました。

 あともう一つ。パス名補完の際に「$」とか「*」とかいう meta
character を含むファイル名は「"」で quote して補完するのです
が、この「"」を追加した場合に閉じるカドウカトイウ些細なお話
です。
 元々入力文字列に「"」が存在しない時に「"」を勝手に追加した
というケースでは閉じるのが礼儀だと思います。しかし、元々「"」
がついていた場合には閉じないのが 2.08b 以降の仕様です。
 これはユーザの意志として、quote が開いたままの状態で補完を
行なったと見なし、その意志を尊重した結果敢えて閉じないままに
してある訳です。
 でも、ファイル名「foobar*baz」に対して「"foo"bar*baz」のよ
うな入力文字列だった場合、これは「"foobar*baz」と開いたまま
にすべきなのか「"foobar*baz"」と閉じるべきなのか、悩ましいと
ころです。
 実際、2.08b〜2.08d の実装は前者だった訳ですが、使ってみる
と結構煩わしいので後者の実装に改めました。

 最後に一つ。PTY の端末 emulation に幾つか escape sequence
を追加しました。
 ESC[8m で不可視モードにして ESC[28m でこのモードを解除しま
す。ESC[37m で描画色のみリセットして ESC[47m で背景色のみリ
セットします。ESC[100m だと描画色と背景色だけリセットします。
 この辺りは VT100 互換ではありませんが xterm に実装されてい
る割と de-facto standard な escape sequence なので、アプリに
よっては TERM=vt100 を名乗ってても平気で使ってくるんですよね。

 どいつも、敢えて書かなかったと言うよりは、割とどーでもいい
話かも知れませんね。

                                               しらい たかし