Konosuke Watanabe
nosuk****@csc*****
2005年 2月 13日 (日) 07:29:43 JST
こんにちは,渡辺です. uim-0.4.6正式リリースが近いようなので,Solarisでもビルドでき るかどうか,r623で試してみました.残念ながらそのままではビル ドできなかったのですが,あれこれいじった結果,なんとか動くよ うになったので報告します. まず,uim-helper.c で使われてる sig_tですが,これはSolarisに はないみたいです. 単なるsignalハンドラだと信じて,とりあえずここは, void (*old_sigpipe) (int); と置き換えて切りぬけてみました. それから,uim-ximの中で使われているstrsepなんですが,自前の 場合,util.hの中で「extern "C"」しないとuim-ximがリンクに失 敗します・・・. が,これだけだとまだだめで,自前strsepの関数名を「uim_strsep」 のように「uim」で始まる名前にしないとuim-xim からリンクでき ませんでした. strsepやx_strsepみたいな「uim」で始まらない名前だと,libtool がmake時にごにょごにょやって,libuim.soで関数が外から見えな くなってしまうみたいです. (nmで見ると,strsep関数は「GLOB」でなく「LOCL」になっている) #初めての経験したんですが,これって常識なんでしょうか・・・? これだけ直すと,ビルドは通るようになります.この状態で,普通 にgtk-demoとかで動き,uim-pref-gtkも動作しました. ただ,これだとまだuim-ximが動きません.即SIGSEGVで落ちちゃい ます. とりあえず locale.cppのget_valid_localesで,localesのNULLチェッ クをつけたところ先に進むようになりました. が,まだだめで,今度はasprintf周辺で落ちてしまいます. 色々実験して調べてみた所,どうも以前メールした 自前 asprintf 関数 に問題があることがわかりました.うー,申し訳ありません. 以下のようにしてやるとよさそうです. +++ util.cpp 2005-02-13 04:11:12.000000000 +0900 @@ -85,9 +85,10 @@ int vasprintf(char **ret, const char *fmt, va_list ap) { int len; + char c; - len = vsnprintf(NULL, 0, fmt, ap); - if (len <= 0) + len = vsnprintf(&c, 1, fmt, ap); + if (len < 0) return len; (*ret) = (char *)malloc(len + 1); 上記修正を入れたら,ようやくuim-ximがSolaris8でも上がるよう になりました. 動かすためにいじった箇所の差分をメールに添付します. --- Konosuke WATANABE <nosuk****@csc*****> -------------- next part -------------- diff -NaruB uim-snapshot-r623/uim/strsep.c uim-snapshot-r623-2/uim-snapshot-r623/uim/strsep.c --- uim-snapshot-r623/uim/strsep.c 2005-01-16 20:02:01.000000000 +0900 +++ uim-snapshot-r623-2/uim-snapshot-r623/uim/strsep.c 2005-02-13 06:38:57.000000000 +0900 @@ -45,7 +45,7 @@ * If *stringp is NULL, strsep returns NULL. */ char * -strsep(char **stringp, const char *delim) +uim_strsep(char **stringp, const char *delim) { char *s; const char *spanp; diff -NaruB uim-snapshot-r623/uim/uim-helper.c uim-snapshot-r623-2/uim-snapshot-r623/uim/uim-helper.c --- uim-snapshot-r623/uim/uim-helper.c 2005-02-08 20:02:04.000000000 +0900 +++ uim-snapshot-r623-2/uim-snapshot-r623/uim/uim-helper.c 2005-02-13 04:42:08.000000000 +0900 @@ -83,7 +83,7 @@ { int res; int len, out_len; - sig_t old_sigpipe; + void (*old_sigpipe) (int); char *buf, *bufp; if (fd < 0) diff -NaruB uim-snapshot-r623/uim/uim-ipc.c uim-snapshot-r623-2/uim-snapshot-r623/uim/uim-ipc.c --- uim-snapshot-r623/uim/uim-ipc.c 2005-01-22 01:02:05.000000000 +0900 +++ uim-snapshot-r623-2/uim-snapshot-r623/uim/uim-ipc.c 2005-02-13 06:40:11.000000000 +0900 @@ -47,7 +47,8 @@ #include "uim-helper.h" #ifndef HAVE_STRSEP -char *strsep(char **stringp, const char *delim); +char *uim_strsep(char **stringp, const char *delim); +#define strsep(stringp, delim) uim_strsep(stringp, delim) #endif /* This function is come from the GNU C Library manual */ diff -NaruB uim-snapshot-r623/xim/locale.cpp uim-snapshot-r623-2/uim-snapshot-r623/xim/locale.cpp --- uim-snapshot-r623/xim/locale.cpp 2005-02-13 07:07:58.000000000 +0900 +++ uim-snapshot-r623-2/uim-snapshot-r623/xim/locale.cpp 2005-02-13 04:43:11.000000000 +0900 @@ -283,6 +283,9 @@ char *tmp, *tmpp; int len = 0; + if( locales == NULL ) + return NULL; + tmp = tmpp = strdup(locales); char *orig_locale = strdup(setlocale(LC_CTYPE, NULL)); diff -NaruB uim-snapshot-r623/xim/util.cpp uim-snapshot-r623-2/uim-snapshot-r623/xim/util.cpp --- uim-snapshot-r623/xim/util.cpp 2005-01-16 20:02:01.000000000 +0900 +++ uim-snapshot-r623-2/uim-snapshot-r623/xim/util.cpp 2005-02-13 04:43:34.000000000 +0900 @@ -85,9 +85,10 @@ int vasprintf(char **ret, const char *fmt, va_list ap) { int len; + char c; - len = vsnprintf(NULL, 0, fmt, ap); - if (len <= 0) + len = vsnprintf(&c, 1, fmt, ap); + if (len < 0) return len; (*ret) = (char *)malloc(len + 1); diff -NaruB uim-snapshot-r623/xim/util.h uim-snapshot-r623-2/uim-snapshot-r623/xim/util.h --- uim-snapshot-r623/xim/util.h 2005-02-09 01:02:03.000000000 +0900 +++ uim-snapshot-r623-2/uim-snapshot-r623/xim/util.h 2005-02-13 06:44:12.000000000 +0900 @@ -56,6 +56,13 @@ #endif #ifndef HAVE_STRSEP -char *strsep(char **stringp, const char *delim); +#ifdef __cplusplus +extern "C" { +#endif +char *uim_strsep(char **stringp, const char *delim); +#define strsep(stringp, delim) uim_strsep(stringp, delim) +#ifdef __cplusplus +} +#endif #endif #endif