Barbarism begins at internet:2004年03月分

2004/03/01(Mon)

(略

@citrus gettext/libintl

むう。

bash-2.05b$ LANG=ja gdb fetchmail
GNU gdb 5.3nb1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386--netbsdelf"...(no debugging symbols found)...
(gdb) run
Starting program: /usr/pkg/bin/fetchmail 
(no debugging symbols found)...(no debugging symbols found)...
(no debugging symbols found)...(no debugging symbols found)...
(no debugging symbols found)...(no debugging symbols found)...
Program received signal SIGSEGV, Segmentation fault.
0x48226b16 in strcasecmp () from /usr/lib/libc.so.12
(gdb) bt
#0  0x48226b16 in strcasecmp () from /usr/lib/libc.so.12
#1  0x48092ff6 in __gettext_iconv () from /usr/lib/libintl.so.0
#2  0x48092e24 in dcngettext () from /usr/lib/libintl.so.0
#3  0x48091f0b in gettext () from /usr/lib/libintl.so.0
#4  0x08064661 in free ()
#5  0x080518e5 in free ()
#6  0x0804a802 in free ()
(gdb) 

gdbで追ってみると

Breakpoint 2, __gettext_iconv (origmsg=0x4826e15a "アカウント %s , サーバ %s", 
    db=0x8081000) at /usr/src/lib/libintl/gettext_iconv.c:108
108             const char *fromcode = db->mohandle.mo.mo_charset;
(gdb) s
118             int savederrno = errno;
(gdb) p fromcode
$1 = 0x0
(gdb) 

で既にfromcodeが(ガッ、な状態。

@で結局のところ

msgunfmt /usr/pkgsrc/share/locale/ja/LC_MESSAGES/fetchmail.mo

してみると、例の GNU gettext拡張 である

"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=EUC-JP\n"
"Content-Transfer-Encoding: 8bit\n"

が無い、旧(つか元々のSunOS gettext)形式のmessage catalogだというオチ。

@

*.moにcharset指定が無い場合

  • 無変換(だから化けるかもよ)
  • エンコーディングを自動判定

の2つが考えられるけど、
http://www.openi18n.org/docs/html/LI18NUX-2000-amd4.htm 読んだ限りでは
前者でいいみたいね、なんでpatch。

Index: gettext_iconv.c
===================================================================
RCS file: /home/cvs/NetBSD/src/lib/libintl/gettext_iconv.c,v
retrieving revision 1.4
diff -u -r1.4 gettext_iconv.c
--- gettext_iconv.c	20 Jan 2004 12:04:48 -0000	1.4
+++ gettext_iconv.c	1 Mar 2004 21:10:43 -0000
@@ -144,7 +144,7 @@
 	 * shortcut if possible.
 	 * XXX should handle aliases
 	 */
-	if (!strcasecmp(tocode, fromcode))
+	if (fromcode == NULL || !strcasecmp(tocode, fromcode))
 		return origmsg;
 
 	/* XXX LOCK */

2004/03/14(Sun)

(ry

@私事ですが

webも見れない、メールも読めないとこに飛ばされマスタ。

@Citrus/libintl

http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libintl/gettext_iconv.c
んな訳でsend-prサボってたらいつの間にか。ありがとうございます。

@zW encoding / mbrtowc

/diary/?20030808#08-1
/diary/?20030813#13-1
の件だけれども、こんなのハッケソ↓
http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_288.htm

(size_t)-3を返せば良くなるのかね。

2004/03/21(Sun)

(ry

@GNU libiconv

iconv -l してみるとサポートしているエンコーディングにC99とかJAVAとかハッケソ。

$ echo "あいうえお" | /usr/pkg/bin/iconv -f EUC-JP -t JAVA
\u3042\u3044\u3046\u3048\u304a

Unicode Escape Sequenceって実体参照の範疇だからiconvで扱うのもなんだかなぁ。
将来的にHTML/XMLの"௢"とかもサポートされて、XSS脆弱性が見つかったりして。

@ってなわけで

Citrusでも互換性の名の元に、てけとーに実装してみた↓
/distfiles/citrus/NetBSD/citrus_ues-20040320.diff.gz
wcrtombでsnprintfのformat使ってるのはマズーだけど、まあ手抜きですから。
そのうち直す予定。
あと、こいつもzWと同じくmbstate_tにvalidなsingle byteが残る問題があるので、
iconvを直さんと変換が途中でstopしてしまう場合があるけど、まあまあ使える。

2004/03/28(Sun)

(ry

@私事ですが

この数週間その関係でバタバタしとったのですが、正式に異動になりマスター。
サーバ管理で遊んでないで開発しろってさ。
4月からのキーワード: Swing + EJB + JDO、環境はWAS + DB2 + AIX。

ちょこちょことServlet + XML(SOAPもどきね)な奴手伝ったこたあるけど
本格的にJavaなお仕事やってたのは、1.0~1.1のApplet + AWT + CORBAな時代。
Java書きとしては既に屍骸なんだけどいいのかねぇ。
若者にeclipseよりVisual Cafeの方が速いとか力説してやるか。

@UTF-7

そういやGNU libiconvをいじってて、surrogate pairを忘れてたことに気づく。
Unicode2.0の時点では既に導入されてたんだよね。
よく読みましょう>>RFC2152 ... 吊ってきますです。

2004/03/29(Mon)

(ry

@Citrus/zW

8月からいろいろ気付いた点があったので、だいぶ書き直した。
/distfiles/citrus/NetBSD/citrus_zw-20040329.tar.bz2

zw2hzは"z\nzW!!\nzW!!"というバイト列を L'z' + 0x2121 + 0x2121でなく
L"z\nzW!!" + 0x2121という変換をする(改行でもinitial stateにならない場合がある)。
どう考えてもバグっぽいんだけど、pkgsrc/print/cnprintでも同様っぽい
(つか同じ変換ロジックを使用?)ので、現状ではそちらに合わせた。

ちなみにデバグ中にmozillaのHZサポートは'~\n'をline continueとして扱わないとか、
zw2hzは'~'を'~~'に変換してくれんとか、いろいろ悩んだ。

2004/03/30(Tue)

(ry

@Citrus

zWにミスがあったので差替え、ファイル名一緒。
utf7も修正中...

@UTF-8

http://www.freebsd.org/cgi/cvsweb.cgi/src/share/mklocale/UTF-8.src
BMP外もサポート、GJ。

@freedesktop.org

こんなことやってるみたい。
http://www.freedesktop.org/Software/XlibToDoList
Redo locale support to use iconv - this would save 1/4 megabyte!