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は難しいとしみじみ。