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

2010/03/14(Sun)

[NetBSD] TODO追加

もういっちょ忘れてた、wchar_t を int から unsigned int(or uint32_t) に変更して
32bit through にするか否かのジャッジメントですの。

ついさっきまで単純文字定数は型 int を持つ(6.4.4.4)という仕様に気を取られてて

	wchar_t *ws = ...

	if (*ws == '\0')
		...

みたいな wchar_t と単純文字定数の比較なんてよくあるコードに gcc -Wsign-compare 的な
compiler の警告が引っかかったら困るよなーとか思って「むりむりカタツムリ」だと
思ってたけど、これ警告出ないよね :-P まずちゃんと試してから発言せいや>>俺

こっち↓のケースはたうぜん警告出るけど、これはcastしない香具師が悪いか。

	wchar_t *ws = ...
	int y = '\0';

	if (*ws == y)
		...

まそもそも wchar_t が negative value 持ったって問題ないのだけどね
char だって signed な環境なら negative value 持つのと同じだよねー。

ただ strcmp(3) の戻り値って unsigned char 同士で比較した結果を返すのだけど
その wchar_t 版である wcscmp(3) の戻りは unsigned wchar_t なんてものは無いので
どうすんの?ってだけ(NetBSD では __nbrune_t を使うことで回避している)。

ま、仕様上では strcmp(3)だと

both interpreted as type unsigned char

の一文があるけど、 wcscmp(3)の方は wchar_t の unsigned 表現にして比較しろなんて一文はどこにもないので
何の問題もないという話もある、wcscmp(3)GB18030 localeで4byteコードが1byteコードよりも
小なりになったっていいじゃないというのがCSI道なのかも。
辞書順はたうぜん wcscoll(3) 使えってことですな。

よくある間違い「それwint_tで」というのは大きなマテガイで、あれは wchar_t の
sizeof が 1(=char) とか 2(=short) な実装を念頭において、wchar_tを引数とした
場合に、暗黙の整数拡張が行われた時に発生する問題を考慮して導入されたもんであって
決して wchar_t に対応する符合無し整数型を収める為に十分な大きさを持つ整数型
ではないのよな、32bit なら通常同じ表現だし。

まぁどっちもUCS4 hardwired wchar_tの場合は最大21bitだから問題にならんからねぇ。