ごとけんです

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; }