蝉は、やがて死ぬる午後に気づいた。ああ、私たち、もっと仕合せになってよかったのだ。:2008年02月15日分

2008/02/15(Fri)

[NetBSD] pkgsrc/editors/nvi-m17n その2

ざっとコード読み直してみた。

--- common/multi_iso2022.c.orig      2008-02-15 20:46:33.000000000 +0900
+++ common/multi_iso2022.c   2008-02-15 20:47:03.000000000 +0900
@@ -1545,7 +1545,7 @@
                        consumed++;
                        continue;
                }
-               if ((kbuf[i] == 0x8e && (shifttype & S_SS3R))
+               if ((kbuf[i] == 0x8e && (shifttype & S_SS2R))
                 || (kbuf[i] == 0x8f && (shifttype & S_SS3R))) {
                        cs = isostate.charsets[kbuf[i] - 0x8e + 2];
                        switch (cs->type) {

まあtypoですな、それと

1568                         singlegl = singlegr = kbuf[i] - 0x8e + 2;
1569                         i++;
1570                         consumed++;
1571                         /* fall through */
1572                 }
(中略)
1586                 if (kbuf[i] & 0x80) {
1587                         /*
1588                          * character range check.
1589                          */
1590                         switch (GRcharset->type) {

1569行目でiをインクリメントした後 FALLTHROUGHして、1586行目でkbuf[i]の評価をしてるけど
i == kbuflenだった場合にはiso2022_keyinput()をrestartする必要があるんだよな。
そのチェックが不十分なので、kbufをindex out of boundsしてしまい
後の処理が想定外になってるのが原因っぽいやね。

それとrestart可能ということはiso2022_keyinput()って基本的に
mbrtowc(3)とよく似た動作を求められるってこととイコールなのだけど
両者を比較してみると、NetBSDのsrc/lib/libc/citrus/modules/citrus_iso2022.cでは

 94 typedef struct {
 95 	_ISO2022Charset g[4];
 96 	/* need 3 bits to hold -1, 0, ..., 3 */
 97 	int     gl:3,
 98 	        gr:3,
 99 	        singlegl:3,
100 	        singlegr:3;
101 	char ch[7];	/* longest escape sequence (ESC & V ESC $ ( F) */
102 	int chlen;
103 	int flags;
104 #define _ISO2022STATE_FLAG_INITIALIZED	1
105 } _ISO2022State;

と、_ISO2022State(=mbstate_t)は99~100行目のとおりシングルシフトの
状態を保持するのだが、nvi-m17nのcommon/multi_iso2022.cだと

113 struct _iso2022state {
114 	CHARSET const *charsets[4];
115 	int     gl;
116 	int     gr;
117 };
118 typedef struct _iso2022state ISO2022STATE;

の通り、ISO2022STATEはシングルシフトを保持しないのよな。

そのうち続く。

今日

この専門家トースターの危険性も警鐘すべきだろ。

何度でも蘇(以下略

Pale Fountains再結成! 、もしかしてネオアコって今リバイバル中?
大昔 ...from across the kitchen table の 3. Jean's not happening を演ったことがあるわ、懐かしい。