[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00491] Re: FDclone 2.08b has been released
- Subject: [FDclone-users:00491] Re: FDclone 2.08b has been released
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Thu, 30 Mar 2006 21:57:27 +0900
しらいです。
In Message-Id <20060330124654.94AFF40C508@yuka.unixusers.net>
Takashi SHIRAI <shirai@unixusers.net>writes:
> しらいです。
> 以下は HISTORY より今回の変更点の抜粋です。
今回の変更点、数だけは多いです。
> Cygwin 1.5.19 対応。
何故か 1.5.19 から dirent 構造体が d_ino 要素を持たなくな
ってしまい、compile に失敗してしまうようになってしまいました。
仕方ないので FDclone 側で d_ino が無い環境に対応しました。
BSD 系だと d_fileno、SYSV 系だと d_ino という要素が存在す
るのが普通なのですが、他にも普通じゃない環境があるようなら対
応しないといけませんね。
Cygwin って Linux と source レベルでの互換性を目指してたよ
うな気がするんですが、もうそういう気はないようですね。
> PTYMODE=1 時のコマンドラインからの内部コマンド実行に対応。
今回一番手間のかかった部分です。この実装途中で発覚した bug
が結構あります。
[FDclone-users:00465] でも書きましたが、これまで疑似端末モ
ードでは内部コマンドの使用を禁止していたのですが、これを可能
にするように改めました。
各内部コマンド毎に異なったアプローチでの実装になっています
が、どのコマンドもまあ期待通りの挙動を示すと思います。
> 一部の環境で入力キーを取りこぼすことがある点を修正。
一部の環境である特定の文字列を入力した時に、文字列中の途中
の文字が入力漏れしてしまうという症状がありました。
termcap/terminfo DB では、TERM の値に vt340 辺りの端末エン
トリに対して、function key のラベル名として「pf1」とか「pf2」
とかいった値が設定されています。
この文字列の一部を打鍵した場合、これが function key の吐く
key sequence の一部だと見なされて、途中の文字が欠けてしまっ
ていました。
「pf1」という文字列そのものを入力した場合は仕方ないのです
が、「pfx」のように途中まで同じという場合までもがこの影響を
受け「px」という形で一文字欠けてしまいます。
これはそもそもラベル名なので、key sequence として解釈すべ
き文字列ではないのですが、一部の termcap/terminfo DB では何
を勘違いしたかこの値を function key の key sequence として登
録してあるのです。
具体的には往年の NEWS-OS という OS のことなんですが、この
環境では function key を認識する為に何故かラベル名を DB から
参照する必要があります。
NEWS-OS だとこの値は escape sequence になっていて普通の打
鍵では現れにくい文字列なのですが、「p」は比較的普通に打鍵し
てしまうので、ラベル名「pf1」が登録されているとキーの取りこ
ぼしが目立ってしまいます。
この症状は単に ungetch() し忘れていただけなので、正しく実
装し直すことで文字の取りこぼしを無くしました。
> "!文字列" 形式のヒストリが非検出時に異常終了する点を修正。
コマンドラインから「!string」と入力すると、コマンド履歴の
中から「string」で始まるものを探し出して実行するというのが本
来の仕様です。
この時、検索に失敗してしまうと実行すべきコマンドを見失って
異常終了していました。
> メタ文字を含むファイル名補完がおかしかった点を修正。
meta character を含む filename を補完する場合、bash の実装
では各文字毎に「\」で escape して「\'\*\?」のように展開する
のですが、FDclone では「"'*?"」のように quote で対応します。
bash も元々は quote 派だったのですが、「"」の中では「$」や
「\」は meta character のままですし、「'」の中では「'」その
ものを表現する手段がないし、個別対応が面倒なので escape 派に
なったんだと思います。
しかし、見比べると判るとおり、meta character の数が増えれ
ば増えるほど escape 派では補完後の文字列が長くなって扱いにく
くなってしまいます。
補完後の文字列を簡潔なものにするため、FDclone は quote 派
なんですが、これはやっぱり parse が厄介なんですね。
例えば「!」を含む filename が補完出来なかったり、「?」を最
初から「"」で quote してから補完すると引用符を「'」に変えて
くれなかったりと、色々と不都合がありました。
今のところ思いつく限りの meta character には対応させてあり
ますが、まだ正しく補完されないような filename があるようでし
たら報告をお願いします。
> PTYMODE=1 時にマクロでマークファイルが無視される点を修正。
[FDclone-users:00460] から始まる thread の一件です。
> PTYMODE=1 時に ANSICOLOR=2 指定が効かなくなる点を修正。
[FDclone-users:00471] から始まる thread の一件です。
> PTYMODE=1 時にカレントディレクトリ変更が伝わらない点を修正。
[FDclone-users:00476] から始まる thread の一件です。
> mlterm で終了後の端末状態がおかしくなる点を修正。
[FDclone-users:00467] から始まる thread の一件です。
> 表示すべきファイルがない時に OUT_DIR が効かない点を修正。
[FDclone-users:00484] から始まる thread の一件です。
> bgnotify フラグが EXECUTE_SH を抜けると効かなくなる点を修正。
background job が終了した場合、その次のコマンドライン入力
時に「Done」と表示されます。bgnotify flag を設定しておくと、
コマンドライン入力を待たずに「Done」が表示されます。
ところが、終了した時点で既に EXECUTE_SH を抜けて browse 画
面に戻っていると、bgnotify flag を設定しておいても「Done」の
表示がされませんでした。
browse 画面も含めて shell なので、EXECUTE_SH を抜けた後も
background job の監視を続けるように改めました。
> バックグラウンドジョブがおかしな出力をすることがある点を修正。
一般に signal handler の中では re-entrant な関数しか使って
はいけないことになっています。re-entrant とは、ある関数の中
から再帰的にその関数を呼んでも支障ないという性質のことです。
signal handler で使用しているある関数が、たまたま別のとこ
ろで実行されている時に割込が発生した場合、その関数の処理中に
signal handler 経由でその関数が呼ばれてしまいます。
この時その関数が re-entrant でないと、二重に呼ばれて予期せ
ぬ挙動を示してしまいます。
一般に printf() 系の関数は static 領域の変数を使っていたり
して re-entrant でないのですが、FDclone は独自の printf() 実
装を持っており、そっちは re-entrant に作ってあります。
なので、signal handler からその独自の printf() 系関数を使
っていたのですが、fprintf() 相当の関数が非 re-entrant になっ
てしまっていました。
fprintf() 自体は問題ないのですが、引数に stderr という大域
変数を使ってしまい、この buffering がうまく動いてくれないと
いう結果に陥っていました。
勿論、これはタイミングの問題なので、そう簡単には再現しない
のですが、再現すると場合によっては freeze してしまうこともあ
り、なかなかに致命的でした。
回避法としては stderr の代わりに stderr を二重化したものを
用いることで解決しています。
しらい たかし