2006年8月16日の日記を表示中
2006年 8月16日 (水)
■喉が・・・
起きたら昨日より喉が痛いし(´・ω・`).
■x86_64 vs Emcws-21.3 + Wnn7
どうにかビルドできたx86_64環境のEmcwsですが,Wnn7で入力しようとすると,サーバと通信し始めたところでセグって落ちます.もしかしてEmcwsってWnn7ダメなんだっけ?とググってみたら自分の日記に「できた」と書いてありました・・・.そうなのかー.あ,確かに32bit版だと動くわ.
早速gdbで見てみたところ,何やら「get_pwd」という関数でセグってます.何か引数のポインタがポインタっぽくない値(0x100000000)で,そこを読もうとして落ちてました.なんじゃこらと手繰ってみると,このまずい引数自体はEmcws側の「Fwnn_fisys_dict_add」から「jl_fi_dic_add」に渡されてる模様・・・.あれ?でもここでは定数0を渡してるよなぁ.何で0x100000000なんかになるの?ULとかつけなくても関数の型宣言見てコンパイラが適当に64bitとしてくれたりするんですよね・・・違うっけ?
とりあえずヘッダを見てみるかということで,Wnn7SDKのjllib.hを見てみると・・・
extern int jl_fi_dic_add();
extern キタ━━━(゜∀゜)━( ゜∀)━( ゜)━( )━( )━(` )━(A` )━('A`)━━━…‥ _|‾|○
えーと,つまり,Emcwsのsrc/wnnfns.cは引数の型を決め打ちで処理しているということか?ううう,何でヘッダに型を書いといてくれないわけ・・・?けちだなぁ.scim-wnnはどうしてるのかなーとソースを覗いてみたらsrc/wnnproto.h に自前のプロトタイプがいっぱい書いてありました.な,なるほど.
仕方ないので必要な関数のヘッダを自前で用意するかねぇ.jl.cやjs.cから適当にawkで抽出できるかな・・・
static int jl_fi_dic_add_e_body(env, dic_name, hindo_name, suflag, rw, hrw, pwd_dic, pwd_hi ndo, error_handler, message_handler) register struct wnn_env_int *env; char *dic_name; char *hindo_name; int suflag; int rw, hrw; char *pwd_dic, *pwd_hindo; int (*error_handler)(), (*message_handler)(); {
K&R キタ━━━(゜∀゜)━( ゜∀)━( ゜)━( )━( )━(` )━(A` )━('A`)━━━…‥ .というわけで自分でやるのは早々に諦め前にtkngさんがメールにちょろっと書いていたcprotoってやつを使って抽出してみました.すげ,超簡単.
作ったjs.cとjl.cの関数宣言をemcwsのsrc/wnnfns.cでincludeしてやったところ,型が合わないところがボロボロと・・・.つか引数の個数違うところとかあるし.実は32bit版もヤバいんじゃ・・・.src/wnnfns.cをいじって,jllib.hの入力予測関連の関数の半端に嘘が書いてあるexternをザックリ消したら,無事x86_64環境でもWnn7で入力できるようになりました.あー,疲れた.まあ,こんなもん未だに入れてる自分もあれですが,やっぱヘッダくらい欲しいよなぁ.つかWnn7なんかもうやめようぜ・・・.もしくは素直にななたまご使うとかさぁ.なんて自覚せずに使ってる人に伝えるのは難しいんですよねぇ.
[コメントを書く]
2006年8月16日の日記を表示中
[コメントを書く]