[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[freewnn:00698] Re: uum patch for 1.1.1-a018
- To: freewnn@tomo.gr.jp
- Subject: [freewnn:00698] Re: uum patch for 1.1.1-a018
- From: YABUKI Youichi <yabuki@XXXX>
- Date: Thu, 16 Aug 2001 20:43:00 +0900
- In-Reply-To: Your message of "Thu, 16 Aug 2001 08:50:16 JST." <20010816085016J.hiroo@oikumene.gcd.org>
- Reply-To: freewnn@tomo.gr.jp
- User-Agent: EMH/1.10.0 SEMI/1.13.7 (粟津
)CLIME/1.13.6 (中ノ庄
) Emacs/20.7(i386-vine-linux-gnu) MULE/4.1 (葵
)
> 飯島> 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>