高橋征義です。

matz / ruby-lang.org (Yukihiro Matsumoto)さん:
> |str_sublen(str, len, enc)の定義より、返り値が0以上に
> |なってしまうため、のようです。だもんで、こんな修正で
> |とりあえずは動くようになります。
> 
> ありがとうございます。この修正でよいと思います。

それはよかったです。

> M17Nはとりあえず動いた段階でなんとなく満足してしまっています
> が、実際に使うにはまだまだ使いにくいだろうと自覚しています。
> 忌憚ない意見を歓迎しますです。

……そのようですね……。makeは通るようになったのですが、実は
インストール(make install)には失敗していたのでした。

lib/ftools.rbの中で、

	  t = to.syswrite(r[w, rsize - w])

という行があるのですが、この r はバイナリ(.soファイルの中身)
なのにEUC-JPと認識されています。むむ。

--- ftools.rb.org	Thu Jun 28 00:45:08 2001
+++ ftools.rb	Thu Jun 28 00:45:27 2001
@@ -38,6 +38,7 @@
 	rsize = r.size
         w = 0
 	while w < rsize
+          r.encoding = 'latin1'
 	  t = to.syswrite(r[w, rsize - w])
 	  w += t
  	end


こんな感じにすると動いているっぽいですが、これはさすがに
「latin1じゃないっしょ」と自分で突っ込みたくなってくるので、
バイト列用の「encoding(というか何というか)」は用意して
おいてほしいです。

# というか、デフォルトのencodingはeuc-jpなんですか?
# ていうか、それってparse.yに直接書かれるものなんですか?(汗;

それと、encoding名はaliasが必要になりそうですね。少なくとも
latin1もISO-8859-1もどちらも使いたい、ということなら。


もう一点。rubiconのTestString.rbを試したらエラーが出ます。
str_strlenにencが渡されてませんでした。


--- string.c.org	Thu Jun 28 06:14:02 2001
+++ string.c	Thu Jun 28 06:18:13 2001
@@ -1321,7 +1321,8 @@
 	beg = NUM2INT(argv[0]);
 	len = NUM2INT(argv[1]);
 	if (len < 0) rb_raise(rb_eIndexError, "negative length %d", len);
-	slen = str_strlen(str);
+        enc = rb_m17n_get_encoding(str);
+	slen = str_strlen(str, enc);
 	if (beg < 0) {
 	    beg += slen;
 	}


# ここで rb_m17n_get_encoding(str) するよりも、
# 後ろにある rb_m17n_enc_check(str, argv[2], &enc) を前に持って
# くるべきかも。

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