ごとけんです
In message "[ruby-ext:00631] kakasi library bug"
on 99/12/01, Shugo Maeda <shugo / netlab.co.jp> writes:
>前田です。
>
>kakasiライブラリを使っているのですが(ごとけんさんありがとう)、
どもども ^^;
>化け化けの文字列の後に、
>
>No such file or directory.
>
>とのたまってスクリプトが終了してしまうことがあります。
>どうもopt_ptrがNULで終わっていないのがまずいみたいです。
やまださんから個人的に送ってもらったパッチで "\0" を含む文字
列の問題と併せて解決しそうです。みたところばっちり良さそうだ
し、検証する時間は今ないので、最後につけます。やまださんあり
がとう __;;
# 残るは kakasi("-ojis", "日本語") のJISが閉じない問題か…
>ところで、man strtokすると、
>
>バグ
> この関数は絶対に使用しない事。
>
>と書いてあったりするのですけど^_^;
^^;;; えっと、要するに、strtok(3)に渡した文字が書き換えられ
るのが問題のようなのですが、alloca(3) でとった文字列に適用し
てるので今回は問題ないはずです。たしか、Ruby本体でも使ってる
んじゃなかったかなぁ。
-- gotoken
In message "Re: [ruby-ext:00617] Re: [BUG] Kakasi::kakasi('','')"
on 99/12/01, akira yamada / やまだあきら <akira / arika.org> writes:
>やまだあきらです.
>In article 00617, <199911300310.MAA12486 / hanare00.math.sci.hokudai.ac.jp>
>G> となります。時間がとれたらパッチ出しますが代わりに書いてくれ
>G> るのは大歓迎です。
>
>間違っているかもっていうか, これじゃなんか
>ダサそうなのでこっそり提案してみます(^_^;;
>こんなんどうでしょうか.
--- kakasi.c.orig Mon Nov 29 19:52:03 1999
+++ kakasi.c Wed Dec 1 18:56:26 1999
@@ -17,7 +17,7 @@
rb_kakasi_kakasi(obj, opt, src)
VALUE obj, opt, src;
{
- int argc = 0;
+ int argc = 0, i = 0;
char **argv, **opts;
char *buf, *opt_ptr, *t;
VALUE dst;
@@ -25,7 +25,7 @@
Check_Type(src, T_STRING);
/* return "" immediately if source str is empty */
- if (*(RSTRING(src)->ptr) == '\0')
+ if (RSTRING(src)->len == 0)
return rb_str_new2("");
Check_Type(opt, T_STRING);
@@ -47,6 +47,7 @@
opt_ptr = ALLOCA_N(char, 1 + RSTRING(opt)->len);
strncpy(opt_ptr, RSTRING(opt)->ptr, RSTRING(opt)->len);
+ opt_ptr[RSTRING(opt)->len] = '\0';
if (*opts++ = strtok(opt_ptr, " \t")) {
argc++;
@@ -61,9 +62,22 @@
dic_closed = 0;
}
- buf = kakasi_do(RSTRING(src)->ptr);
- dst = rb_str_new2(buf);
- free(buf);
+ dst = rb_str_new2("");
+ while (i < RSTRING(src)->len) {
+ if (*(RSTRING(src)->ptr + i) != '\0') {
+ buf = kakasi_do((RSTRING(src)->ptr + i));
+ rb_str_concat(dst, rb_str_new2(buf));
+ free(buf);
+ while (*(RSTRING(src)->ptr + i) != '\0') {
+ i++;
+ }
+ }
+ if (i == RSTRING(src)->len) {
+ break;
+ }
+ rb_str_concat(dst, rb_str_new("\0", 1));
+ i++;
+ }
return dst;
}