[uim][mlterm] キタコレ (;´Д`)
if( engine == NULL || strlen( engine) == 0) { engine = (char*)uim_get_default_im_name( kik_get_locale()) ; /* (1) */ #if 0 engine = kik_str_alloca_dup (engine); #endif } if( ! find_engine( engine , &encoding_name)) /* (2) */ { kik_error_printf( "%s: No such conversion engine.\n" , engine) ; goto error ; }
前巻までのあらすじ: mlterm に現れる上記の code を走らせると、(1) で返されてきた engine なる文字列が、(2) を実行し終わった時点でゴミ値になってるのだ! #if 0 してるところは暫定 fix。
gdb で engine の address に watchpoint を仕掛けて、変更される時点を調べてみました。停止したところで backtrace とりました。
(gdb) watch ((char*)0x212c0b0)[0] Hardware watchpoint 2: ((char *) 34783408)[0] (gdb) c Continuing. Hardware watchpoint 2: ((char *) 34783408)[0] Old value = 97 'a' New value = 0 '\0' 0x00007f858a443574 in ?? () from /lib/libc.so.6 (gdb) bt #0 0x00007f858a443574 in ?? () from /lib/libc.so.6 #1 0x00007f858a443a56 in free () from /lib/libc.so.6 ← 注目 #2 0x00007f8587ff4a8a in ?? () from /usr/lib/libuim-scm.so.0 #3 0x00007f8587ff5496 in ?? () from /usr/lib/libuim-scm.so.0 #4 0x00007f8587ff5649 in ?? () from /usr/lib/libuim-scm.so.0 ...
…アウトです、どうみても。本当にありがとうございました。
uim_get_default_im_name() が返した値には賞味期限があります。uim の API を次に呼ぶときまで、です。それまでに copy しましょう。uim の code よく見たら一発でわかるじゃないすか。今まで時間かけた自分バカス。
追記: uim 側の code でも、一部にはちゃんとそういう comment がついてるねぇ。でも uim_get_default_im_name() の定義には書いてないなあ。Javadoc みたいにして書いとこうか。将来 API ref を自動生成できるようになりますように、と。
追追記: と思ったら commit できない gmail と同じ username + password かと思ったら違うらしい。Protocol が http になってるのと関係あるのかと思って、https とかに access しようとするけど、認証されない。むしろ発行してる command が間違い? ようわからん。どうしよ。
jun@debian /dvl/uim/trunk/uim $ svn info Path: . URL: http://uim.googlecode.com/svn/trunk/uim Repository Root: http://uim.googlecode.com/svn Repository UUID: ff9ab193-ed19-0410-b3e9-fd3dc8ba15a0 Revision: 5631 Node Kind: directory Schedule: normal Last Changed Author: koutou Last Changed Rev: 5627 Last Changed Date: 2008-11-19 05:20:24 -0600 (Wed, 19 Nov 2008) jun@debian /dvl/uim/trunk/uim $ svn co svn://uim.googlecode.com/ Authentication realm: <http://uim.googlecode.com:80> Google Code Subversion Repository Password for 'jun': Authentication realm: <http://uim.googlecode.com:80> Google Code Subversion Repository Username: jun.lambda Password for 'jun.lambda': Authentication realm: <http://uim.googlecode.com:80> Google Code Subversion Repository Username: jun.lambda Password for 'jun.lambda': svn: Commit failed (details follow): svn: MKACTIVITY of '[...]': authorization failed (http://uim.googlecode.com)
しかし、documentation には「subverion book 読め」と書いてあるだけで、こういう google 側の setup 依存の情報が殆ど書かれてないのは何故なんだぜ。皆 (使えてる所からすると) 困ってないみたいですけど、何でわかるんですか。