[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00823] msg_* functions



小野寛生です

Wnn/etc/msg.c の getlang() に

#ifdef  HAS_SETLOCALE
      lang = setlocale (LC_ALL, NULL);  
      if (lang == NULL || *lang == '\0')
#endif  

という部分がありますが、configure では setlocale() の有無を調べていま
せんし、autoconf なら HAVE_SETLOCALE になるはずです。
この HAS_SETLOCALE がどこで定義されているか調べたら、

chrysanthe% grep -R SETLOCALE *
Wnn/etc/msg.c:#ifdef  HAS_SETLOCALE
cWnn/etc/msg.c:#ifdef  HAS_SETLOCALE
kWnn/etc/msg.c:#ifdef  HAS_SETLOCALE

% make clean していないので、cWnn、kWnn がはいってしまっています

ということで、つまり「この部分はずっと動いていなかった」ことになります。
で、getenv() が使われていますが、setlocale を使うようにしたらどうなるん
でしょうか?
setlocale のありかをしらべると、msg.c をリンクするプログラムでは、上記
の部分で始めて setlocale が呼ばれるので、"C" が返るということになる気
がしますが、あっていますか?

ただし、
・getlang() が呼ばれるのは、msg_open() 経由のみ。
・問題の部分にくるのは引数が NULL の時のみ。
・引数は msg_open() に渡されたものがやってくる。
ということで、見て行くと、

jserver/de.c では、jd_sock.h で定義された LANG_NAME を渡している。
jutil/wnnstat.c では、WNN_DEFAULT_LANG (wnn_config.h で定義)
XWnmo ... 見てません。

というわけで、そもそもここは呼ばれていないようです。

msg_*() は poorman's gettext なんで *.msg ファイルまわりの処理直す
より、いっそ gettext 使うように変えた方が楽なんではという気がしなく
もなかったりします。
Wnn4 開発当時、こういう仕組みが入ったというのはすごいと思いますが。

あと、*server では、エラーメッセージは各言語で表示しなくていいんじゃ
ないか、とか。
現状 wnn/C/*.msg がないので、daemon として動かしている時に log に残
るエラーメッセージは、% メッセージの番号と、"Message not found" だけ
ではないかと思います。

なんにせよ、msg_* 周りの仕様と動きはきちんと見直した方がよさそうです。


http://www.freewnn.org/ FreeWnn Project