[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() が返した値には賞味期限があります。uimAPI を次に呼ぶときまで、です。それまでに 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 依存の情報が殆ど書かれてないのは何故なんだぜ。皆 (使えてる所からすると) 困ってないみたいですけど、何でわかるんですか。