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

2010/04/20(Tue)

今日

ねこ三回忌、いまだに思い出すと悲しい。

[NetBSD] TODOs 消化中

例の libc/compat + __LIBC12_SOURCE__ にあわせて insufficient _ctype_ bits の件に対する patch 作成中。
libc/locale/setlocale_local.h と libc/locale/runetype_local.h に ifdef が生じるので本当はこれを
インクルードするファイルは全て compat 送りにしないとならないのだけども、さすがにそれはやっとれんので
_locale_impl_t の構造を若干変更して影響の出るファイルを最小限にとどめ、あとは回避できないコードだけ
compat 送りの刑に処することで回避、とっても危険だけどね。

いちおこれで tech-userlevel に投げるか、反応次第で __LIBC12_SOURCE__ は evil だと暴れることにする(ぉ

あとそれとちょっと前に libstdc++ がらみの問題があるから極力ソース互換を保とうかと 考えてた( その1その2)
のですが、よく考えると今のコードって isprint(3)が

#define isprint(c)      ((int)((_ctype_ + 1)[(c)] & (_P|_U|_L|_N|_B)))

になっとるので、皆さん大好きないわゆる半角カナ(笑)は ja_JP.SJIS の場合だと0xa6~0xdfと
1バイト文字に割り当てられとるわけですが、こいつらについて Ancient BSD由来の ctype は
現在の NetBSD の ctype.hでも

#define _P      0x10	/* Punct 記号 */
#define _U      0x01	/* Uppercase 大文字 */
#define _L      0x02	/* Lowercase 小文字 */
#define _N      0x04	/* Numner(Digit) 数字 */
#define _S      0x08	/* Space スペース */
#define _C      0x20	/* Control コントロール */
#define _X      0x40	/* Xdigit HEX */
#define _B      0x80	/* Blank ブランク */

のいずれにも分類することができない(Runeでは_RUNETYPE_QつまりPhonogram表音文字)ので
isprint(半角カナ)が偽を返すちゅーバグがあるのですよな、この話についてはもう何年も前から
201.5号室長が気づいておられたはずなので、適当に"NetBSD isprint phonogram"でググってちょ。

ということでソース互換放棄、libstdc++についてはupstreamにもpatch投げんとならんめんどい。