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

[freewnn:00698] Re: uum patch for 1.1.1-a018



> 飯島>  getlang_linux.patch として、添付いたします。
> 
> +#ifdef define(linux)
> +      lang = setlocale (LC_ALL, "");
> +#else
> 
>     #ifdef linux
> か、
>     #if defined(linux)
> ですよね?
飯島さんのパッチを拝見いたしましたが,元々の setlocale の使い方に
ついて疑問が.

--- FreeWnn-1.1.1-a018.orig/Xsi/Wnn/etc/msg.c	Thu Jul 26 01:53:17 2001
+++ FreeWnn-1.1.1-a018/Xsi/Wnn/etc/msg.c	Mon Jul 30 13:21:19 2001
@@ -124,7 +124,11 @@
   if (lang == NULL || *lang == '\0')
     {
 #ifdef  HAS_SETLOCALE
+#ifdef define(linux)
+      lang = setlocale (LC_ALL, "");
+#else
       lang = setlocale (LC_ALL, NULL);
+#endif
       if (lang == NULL || *lang == '\0')
 #endif

あまり詳しくないのですが,ここでの setlocal (LC_ALL, NULL) の返り値が常に
"C" になるというのは,Linux に限らないと思います.

FreeBSD, Solaris の man や C の規格書を見ても,
・setlocale(..., NULL) はプログラムの現在のロケールを返す.
  ロケールを変更することはしない.
・プログラムの起動時には,setlocale(LC_ALL, "C") 相当の処理が
  暗黙に行なわれることになっている.
らしいので,setlocale(LC_ALL, NULL) が呼ばれる前にどこかで,
setlocale (LC_ALL, "") とか setlocale (LC_ALL, "何かロケール名")とか
してロケールを設定/変更していなければ,必ず "C" になると思います.
一方,ここで setlocale(LC_ALL, "") とやってしまうと,環境から取り出して
ロケールを「設定」してしまうことになると思います.

getlang() を意図通りに動作させるには,msg.o をリンクするプログラムの
main() の頭で setlocale(LC_ALL, "") しておく必要があると思いますが,
それをやっていそうなのは,Xwnmo 以下のファイルに限られそうです.
それをやっておけば,ここは setlocale (LC_ALL, NULL) で良くなり,
#ifdef linux による切り分けも必要なくなると思います.
(そうすれば getlang() だけでなく全体的にちゃんと動作するのか?と
言われると良くわかりませんが:-)そもそも,これまでのコードは
どういう動作をしていたのか良くわからないです.)
--
矢吹洋一 <yabuki@sra.co.jp>


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