なかだです。

At Mon, 3 Sep 2001 07:58:23 +0900,
matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> |   ・ Single-byte: 00-80 (*)                                         
> |   ・ Two-byte: 81-fe | 40-7e, 80-fe
> |   ・ Four-byte: 81-fe | 30-39 | 81-fe | 30-39                                 
> |
> |とあります。4バイト文字か2バイト文字かが分かるのは2バイト目を
> |読んだときのようですね。
> 
> ううう、サイテーのエンコーディングですね。既存のエンコーディ
> ング(GBK?)をそのまま拡張したせいのようです。どうやって対応
> するかなあ。

 m17n_mbclen()を使ってるところに関しては、だいたいバイト自体で
はなくポインタを渡すようにしてもよさそうな気がします。

 例外はio_readchar()ですが、バイト列が完結した文字になっている
かを判断するもの(m17n_mbcspan()と似てるけど中途半端ならエラーに
するとか)があればできそうな感じ。

 あとはregex.cのPREV_IS_A_LETTER()がダメダメかも。これはSJIS
hackと同じようにすればなんとかなるかも知れませんが、一般的には
逆方向に文字先頭を探すというインターフェースが必要なのかも。
WindowsにあるCharPrevEx()というのがそれっぽいですが。

# と、ついでにパッチ。


Index: regex.c =================================================================== RCS file: /cvs/ruby/src/ruby/regex.c,v retrieving revision 1.38.4.1 diff -u -2 -p -r1.38.4.1 regex.c --- regex.c 2001/01/12 04:36:00 1.38.4.1 +++ regex.c 2001/09/03 02:11:30 @@ -4017,5 +4017,5 @@ re_match(bufp, string_arg, size, pos, re else goto fail; } - if (AT_STRINGS_BEG(d)) { + if (AT_STRINGS_END(d)) { if (PREV_IS_A_LETTER(d)) break; else goto fail;
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦