Not only is the Internet dead, it's starting to smell really bad.:2007年11月上旬

2007/11/01(Thu)

残念です

NetBSD developerの末席を汚す私(I18N下働き)ですが
itojunさんの

からは本当に多くを学ばせて頂きました。

プログラミングのプの字も知らなかった私(元は営業...)が
コの業界に不時着してから数年、今こうしてささやかながらも飯が食えてるのは
氏をはじめとするhacker方に学ばせていただいたお陰です。
生前、メーリングリストや OpenBSDで日本語環境設定スレでお相手して戴いたことを
深く感謝するとともに、故人のご功績を偲び、謹んで哀悼の意を表します。

2007/11/04(Sun)

[NetBSD] lib/36938

PRくれた方から完全に直ってないぜこらメール届く。
mbtowc(3)が-1を返した場合、internal mbstate_tが初期化されないっての*も*
バグじゃないか? とのこと。

01 #include <assert.h>
02 #include <locale.h>
03 #include <stdlib.h>
04 
05 const char sjis[] = "\x95\x5c";
06 const char space[] = " ";
07 
08 int
09 main(void)
10 {
11 	wchar_t wc;
12 	setlocale(LC_CTYPE, "ja_JP.UTF-8");
13 	assert(mbtowc(&wc, 0, 1) == 0);
14 	assert(mbtowc(&wc, space, sizeof(space)) == 1);
15 	assert(mbtowc(&wc, sjis, sizeof(sjis)) == -1);
16 #if 0
17 	assert(mbtowc(&wc, 0, 1) == 0);
18 #endif
19 	assert(mbtowc(&wc, space, sizeof(space)) == 1);
20 	return 0;
21 }

if 0して再初期化を省いても動かなきゃ変ということらしい。
今は19行目のassertにひっかかる。

でもこれ 仕様読む限り、-1を返す場合、internal stateがどうなるかって記述なし(=未定義動作)だよな。
mbrtowc(3)の場合には(size_t)-1を返す場合errnoにEILSEQをセットして
mbstate_tは未定義とする、とはっきり書かれている。

なのでわざわざ初期化する必要もないので let it be なのだが
glibcはこの未定義動作は``初期化する'' として実装してるみたい。

さてどうしよかね...他の実装もちょっと調べてから返事しようか。

2007/11/05(Mon)

[NetBSD] lib/36938 その2

glibcが``初期化する''として実装しているというか、これmbstate_tの使い方の問題だな。
今のcitrus_utf8.cの実装では

219	/* make sure we have the first byte in the buffer */
220	if (psenc->chlen == 0) {
221		if (n-- < 1)
222			goto restart;
223		psenc->ch[psenc->chlen++] = *s0++;
224	}
225
226	c = _UTF8_count[psenc->ch[0] & 0xff];
227	if (c < 1 || c < psenc->chlen)
228		goto ilseq;

としてるので、223行目でmbstate_tにmulti-byteの先頭1byte読み込んでから
(つまり非initial stateになる)226行目でUTF-8の1byte目かのチェック行うからなんだけど
glibcはおそらく、最初の1byte目のチェックが終わるまでmbstate_tに保存しないので
illegal byte sequenceの場合でもinitiail stateのままになるるっぽい。
ちなみにSolarisもVC++も同様の動きするね。

どっちみちこれ実装依存の未定義動作だと思うので
stateless encodingだからって初期化をサボっていいなんて理由はないはずなんだがな。
こんなとこまでglibcに動作あわせる必要はないと思うが、それを英語で説明書けるほど今頭が働いてない。

週末

草津白根で遊ぼうと思ってたんだけど、風邪こじらせてキャンセル。
ぷらっとから届いたSolaris 10 8/7 MediaKitも放置して寝込んでた。

名札は縦書きなのでtnozaki@併記は無理らしい、multiscriptは難しいとしみじみ。

2007/11/07(Wed)

今日

会社から2駅の距離なので、告別式に参列してきました。

参列者の方々も誰が誰やら状態. の私みたいな人間は
遠慮するべきだったかもしれないくらいの人数。

[NetBSD] lib/37290

lib/37290なんというタイミング(;_;)

これ、こないだrunglue.cにつっこんだwctob()で落ちてるんだけど、
どうやらcitrus_iso2022.cでVARIABLEにMAX2を指定してると
wctob((wchar_t)0xA0)以上では、WEOFを返すのでなくabort()に落ちる模様。
fixはなるべく早めに書く。

2007/11/09(Fri)

[NetBSD] runetable.c

libhack向け修正が入った、まあとりあえずはこれでお茶濁しましょ。
uwsconsの続きがkernelに入るまではi18n sysinst(8)の為に
libhackでmultibyte locale使える必要はないからね。

今日

Sony α-700本日発売、その影響からかα-100の黒ボディが6万切ってた。
まあ6万持っていたならMinolta α-9のSSM改造なし中古買いますが。
デジイチは充電がめんどくてな。