高橋征義です。

# ruby_m17nの話って ruby-dev でいいんでしょうか?

一昨日CVSから持ってきた ruby_m17n をmakeしようとしたところ、
添付ライブラリ(curses)のmakeに失敗しました。使っているのは
FreeBSD 4.2-RELEASEです。

makeした結果は以下のようになります。

(略)
compiling curses
extmk.rb:356:in `+': failed to convert nil into String (TypeError)
        from extmk.rb:356:in `create_makefile'
        from /usr/local/src/ruby/ruby_m17n/ruby/ext/curses/extconf.rb:22
        from extmk.rb:614:in `load'
        from extmk.rb:614:in `extmake'
        from extmk.rb:688
        from extmk.rb:673:in `each'
        from extmk.rb:673
*** Error code 1

で、ちょっと調べてみたところ、String#rindex がマッチしないにも
関わらず0を返しているようです。それは、string.c の
rb_str_rindex(argc, argv, str)の定義の中で、

(略)
    switch (TYPE(sub)) {
      case T_REGEXP:
	rb_m17n_enc_check(str, sub, &enc);
	if (RREGEXP(sub)->len) {
	    pos = rb_reg_adjust_startpos(sub, str, pos, 1);
	    pos = rb_reg_search(sub, str, pos, 1);
	    pos = str_sublen(str, pos, enc);
	}
	if (pos >= 0) return INT2NUM(pos);
	break;


となっているあたりの、
	    pos = rb_reg_search(sub, str, pos, 1);
でposがマイナスになっても、
	    pos = str_sublen(str, pos, enc);
でposが0になるからです。これは、
m17n_encoding(enc)が1ではない場合には、
str_sublen(str, len, enc)の定義より、返り値が0以上に
なってしまうため、のようです。だもんで、こんな修正で
とりあえずは動くようになります。

--- string.c.org	Tue Jun 26 23:59:37 2001
+++ string.c	Wed Jun 27 00:14:08 2001
@@ -518,7 +518,7 @@
     int len;
     m17n_encoding *enc;
 {
-    if (m17n_mbmaxlen(enc) == 1) return len;
+    if ((m17n_mbmaxlen(enc) == 1) || (len < 0)) return len;
     else {
 	char *p = str_ptr(str);
 	char *e = p + len;


#これが正しい修正かどうかは実はあんまり分かってません(汗;

高橋征義 (TAKAHASHI Masayoshi)   E-mail: maki / open-news.com