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

[debian-users:30963] Re: col で日本語



佐野@浜松です。

In <wtw3d3816y2.wl@xxxxxxxxxxxxxxxxxxx>,
 on "Thu, 22 Nov 2001 00:25:51 +0900",
 with "[debian-users:30742] Re: col で日本語",
  GOTO Masanori <gotom@debian.or.jp> さん wrote:

gotom> どうやら、これは col の関数の使い方か、libc かのどちらかに
gotom> 関連があるようです。ちょっと調べてみます。

もしかしたらもう既に原因がわかっていたり BTS にパッチされていたり
するのかもしれませんが、、、

試しに potato 上で 5.20010615-2 を build してみると、ちゃんと
 EUC-JP な日本語が通りました。

この逆に potato 版の 4.7.1 をすこし前の sid/unstable で build して
みたところ、5.20010615-2 同様の現象 (日本語部分だけ欠落する) と
なります。

 4.7.1 と 5.20010615-2 では

@@ -131,12 +135,11 @@
        int nflushd_lines;              /* number of lines that were flushed */
        int adjust, opt, warned;
 
-       err_setprogname(argv[0]);
-       setlocale(LC_ALL, "");
+       (void) setlocale(LC_CTYPE, "");

といった違いがあるので、もしかしたら LC_CTYPE だけでは
ダメで LC_COLLATE も必要とかそういうことがあるのかなと
思ったりしたのですが、LC_ALL でもうまくいかないという
ことは、そういう問題ではなさそう、という感じですね。

上記の unstable/sid 上で

@@ -135,7 +135,7 @@
        int nflushd_lines;              /* number of lines that were flushed */
        int adjust, opt, warned;
 
-       (void) setlocale(LC_CTYPE, "");
+       (void) setlocale(LC_ALL, "");
 
        max_bufd_lines = 128;
        compress_spaces = 1;            /* compress spaces into tabs */
@@ -174,7 +174,7 @@
        lines = l = alloc_line();
 
        while ((ch = getchar()) != EOF) {
-               if (!isgraph(ch)) {
+               if (!isprint(ch)) {
                        switch (ch) {
                        case BS:                /* can't go back further */
                                if (cur_col == 0)
@@ -221,9 +221,11 @@
                                cur_line -= 2;
                                continue;
                        }
+                       goto ESCAPE;
                        continue;
                }
 
+ESCAPE:
                /* Must stuff ch in a line - are we at the right one? */
                if (cur_line != this_line - adjust) {
                        LINE *lnew;


という変更も加えてみました。上の setlocale("LC_CTYPE", "") ->
 setlocale("LC_ALL", "") や isgraph() -> isprint() だけでは
やはりダメでしたが、下のように無理矢理すべて出力させるように
した場合は、当然出力されます。

ということは、glibc 2.2 の isgraph() や isprint() が
 ja_JP.eucJP に対応していない、ということなんでしょうか ?

一応、col を strace で起動してログを見てみましたが、
上記のように build した col もパッケージの /usr/bin/col も

execve("./col", ["./col", "-bfx"], [/* 18 vars */]) = 0
uname({sys="Linux", node="danyasun", ...}) = 0
brk(0)                                  = 0x804a6a8
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
(中略)
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
fstat64(3, 0xbfffb87c)                  = -1 ENOSYS (Function not implemented)
fstat(3, {st_mode=S_IFREG|0644, st_size=2601, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0
x40016000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2601
brk(0x804c000)                          = 0x804c000
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x40016000, 4096)                = 0
open("/usr/lib/locale/ja_JP.eucJP/LC_IDENTIFICATION", O_RDONLY) = -1 ENOENT (No 
such file or directory)
open("/usr/lib/locale/ja_JP.eucjp/LC_IDENTIFICATION", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=334, ...}) = 0
old_mmap(NULL, 334, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40016000
close(3)                                = 0
open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = -1 ENOENT (No such file o
r directory)
open("/usr/lib/gconv/gconv-modules", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42560, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0
x40017000
read(3, "# GNU libc iconv configuration.\n"..., 4096) = 4096
brk(0x804d000)                          = 0x804d000
(中略)
open("/usr/lib/locale/ja_JP.eucJP/LC_COLLATE", O_RDONLY) = -1 ENOENT (No such fi
le or directory)
open("/usr/lib/locale/ja_JP.eucjp/LC_COLLATE", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=404143, ...}) = 0
old_mmap(NULL, 404143, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40143000
close(3)                                = 0
(中略)
open("/usr/lib/locale/ja_JP.eucJP/LC_CTYPE", O_RDONLY) = -1 ENOENT (No such file
 or directory)
open("/usr/lib/locale/ja_JP.eucjp/LC_CTYPE", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=474552, ...}) = 0
old_mmap(NULL, 474552, PROT_READ, MAP_PRIVATE, 3, 0) = 0x401a7000
close(3)                                = 0

のように、gconv-modules や LOCALE 関連のファイルも
ちゃんと読まれているようです。上記は ./col の場合ですが
 /usr/bin/col の場合もメモリーアドレス (とコマンド名) 
以外は同じです。

 potato の libc-2.1.3 は

        while ((ch = getchar()) != EOF) {
                if (!isgraph(ch)) {

のままでも EUC-JP は通っていたようですね。

 locale 方面にはまったく詳しくないんですが、これって
そもそも getchar() を使っているのがダメで getwchar() を
使うべきもの ?

ちょっと online manual を見ながら wchar 対応してみました。
これで良さそうならどなたか BTS report をお願いできませんか ?

--
   # わたしのおうちは浜松市、アカウミガメもやってくる
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)
begin 644 diff.col.c.gz
M'XL("!YI%SP``V1I9F8N8V]L+F,`C57;;N)($'WN?$5%\Q#`.,$VEPELHI`L
MV1DIDUDE&>4E$FJ;!JPX-NO+L)F(?]^JZK8Q,`]K";I=MZXZ=:IMVS8467KJ
MA_%9D$3T.PU..^)9S>!/%8#C@xxxxxxxxxxxxx&.+,LZ=-@Q]X9N;]@;:/.K
M*[![O78?+/S_#%=71_`IC(.HF"GX(\MG4>B?+B_KPB(.4;XGC))`1HJ$UE:X
M#I8R/9#E[RLV!/2?J7D8*W']*$Y>_!,ASEK@R^`U6\E`0>ML:_$TOD:37)OD
MTB<EI3YPVUBX->C20LE3A"*,9E"L0.80*9GED"_##-YD_`X1!LO`5_,D53"/
MBFP9Q@O4JS=(BGSGR.L?M[>3A^FW\<-?7^^%\%S,V*;D40]4&=P\3IY&1U8I
MXW*GN1'7C+,\+8*<?::XAX^MCU&M:[HJ@9O'Z?WWAV_C.^'L",=W3Y.'^_'3
M1&!*(ELF:2Y$,,5&%V_QB`#26SY0!KE*`<L/8ZY.4'9DGJE\Q&ANK5`$C:!(
M4Q7GT3LD,?ZY37*S!5GQ*;CN^V'H?PJ5Y6'"9UC"(/$_[6$#-U_&#P09[.%"
M[6)8[K[>3T;<<<=QV^=@.4X7%^IX&.<B]B,9OTZYN_JT3\"B#.2<CHR(!MQO
M'`0RXX/9-9E6E#.^X1SB!%F3$"=62`MBSM:(78_LLB-__WBZ:03+)KP@SXWL
MN28$,4O@0^#S@C@*#-[`F(0&&UQ<P.3[+7M7RG5=^VS4@!'6J4K31G,DZ'4#
MZV48*6ATFI@/8^-Z[0%BX_9P(6P$5@@R700(+K<06BU\_8FO'Y@,:8/EB#J&
MVZE^08I@-Z#%/L060$H8NG`?-4'V>,/<HBY!*]HS+.'F#`<>WC*6,R@O&V&"
MPP7WR&PKZE,.>F91CS\9X4W#?484J`O"8(!HH7JA-+#-)AP;7#]*T(_#;)'*
MU9)P);%UX+JN^3X;9ZMR7J]2!*GTIFYDZQ"/`VZ4E@0R4W#].-3UR_@DAT7"
MU(%YD>(UDVJ@A(Y*M>.L4I>QAX2/A^S&#GK(;MU!-,90;_)505;@G;56=*?]
M5'2GQ0L>:PF91(2S7.::UAR[0O.X!F>3P&!NGKQTG,%)DWIOV%I)S)D\+7PK
M8MYF@-1:CY6Y1_FP^NPACF_R7]Z#S=<N[_7D>OU!&[\_EM<_IY6[O^$`<'8!
M+K4:KV5HA!@E]D=@VR%<(C*C>M;Q7L[\KBM>RFAN^ET6Y'FDK@3G^P5K_59R
MKJ/IEL<^'UP&2XUIY9UJX\TA!AV4;[CF;L]I.SVPNCV/5JZ9'S]5\G5DWO"#
M-LW"7PI=:4N4L/4XX+8THIRVAA?@Z.RJ!*',;YLBF'+P45&F=NWQ:WK@H&7:
M(]9?85OG1*>6FC*S;;I&L^%%_YOALFT3YY(Y;O\NW_ULZ_&)0N4!'+A46I9F
M5;?_N>W@R'0''5H-PCQ=]F503D`Y#>6@;F?7&%4*'N%J8(8&LX.9$8=C<]#7
M,E3UP3Z(UO]=M'X532,I:A=CF>[((%WQDQ5T?^V0M"XM8;&L@)JAXEG0U/%-
7SC6N^_M<]TU.&TWXS=%_4R%0_)@*````
`
end