The Man Who Fell From The Wrong Side Of The Sky:2010年3月5日分

[最新版] [一覧] [前月] [今月] [翌月]

2010/3/5(Fri)

[NetBSD] libedit I18N への道(その5.2)

@ ふりだしに戻る

なにやら不吉なサブタイトルですが。

さて 前回は el_gets() の返す文字幅がバイトでなくワイド文字になってる件の対策で
ct_encode_string() のインタフェースを変更し、ワイド文字→マルチバイトの変換で
何バイト変換されたかを返すようにすればいいんじゃね?という結論になりましたが
これには実は巨大な落とし穴があります。

なぜなら el_gets() はそもそも内部で mbrtowc(3) のたぐいは使ってはならないのです。
これは 大惨禍い第3回で el_getc() の実装について説明した理由とそのまんま同じです。
現状のコードでは、LANG=ja_JP.eucJP で { 0xA1, 0x41, 0x0 } みたいなマルチバイトを喰わせると
これをワイド文字に変換しようとして変換エラーで EILSEQ になってしまうのですが
el_gets() はあくまでバイト志向の API なのでこれは許されないのですよ、うーアボガドバナナ。


いう
 こと
   は

この問題はかなり致命的です、現在 editline 構造体において一行分のデータは
el_line フィールド、すなわち el_line_t 構造体で管理しているのですが

74 typedef struct el_line_t {
75 	Char	   *buffer;        /* Input line                   */
76 	Char	   *cursor;        /* Cursor position              */
77 	Char	   *lastchar;      /* Last character               */
78 	const Char *limit;         /* Max position                 */
79 } el_line_t;
...
116 struct editline {
...
128 	el_line_t         el_line;      /* The current line information */
...

ちゅうように、すべて Char(=wchar_t) すなわちワイド文字として行情報を保持してやがるのです。
ですのでマルチバイト→ワイド文字変換をしない限り、行情報を保持できないという。困った。

こりゃ完全に設計ミスですな、ちうことは この変更は全部 backout して元に戻さんとならん悪寒。

/(^o^)\ナンテコッタイ

histedit.h では LineInfo と LineInfoW と別なのに…どうしてこうなった…


[ホームへ] [ページトップへ]