From: "K.Kosako" Date: 2002-01-30T14:48:34+09:00 Subject: [ruby-dev:15814] Re: [PATCH] improve on \G nobu.nakada@nifty.ne.jpさんの <200201291723.g0THNud06109@sharui.nakada.kanuma.tochigi.jp>から > > |[ruby-talk:30523]で、-Kを指定すると\Gを使ったマッチが遅いという > > |話が出てます。調べてみると、regex.cのre_adjust_startpos()でマル > > |チバイトの境界を文字列の最初から探しているせいのようです。逆方 > > |向に探すことで-Kがないときとほぼ同じ速度になります。 > > > > んじゃ、これでコミットしてください。 > > すいません、なんか激しく間違ってたんで[ruby-dev:15798]に以下を > 追加してコミットします。全然テスト条件が足りてませんでした。 SJISのときにおかしくなります。 (mbc_startpos()が先頭ではない位置を返します。) #!./ruby -Ks p "あaいう".rindex(/./, 5) # => 4 それと、mbc_startpos()のUTF8の場合に返す値が違っている のではないかと思います。(これは動作確認していませんが。) --- regex.c.orig Wed Jan 30 04:33:11 2002 +++ regex.c Wed Jan 30 14:41:55 2002 @@ -3080,11 +3080,17 @@ re_adjust_startpos(bufp, string, size, s if (current_mbctype && startpos>0 && !(bufp->options&RE_OPTIMIZE_BMATCH)) { int i = mbc_startpos(string, startpos); - if (i < startpos && range > 0) { - startpos = i + mbclen(string[i]); - } - else { - startpos = i; + if (i < startpos) { + if (range > 0) { + startpos = i + mbclen(string[i]); + } + else { + int len = mbclen(string[i]); + if (i + len <= startpos) + startpos = i + len; + else + startpos = i; + } } } return startpos; @@ -4570,10 +4576,16 @@ mbc_startpos(string, pos) switch (current_mbctype) { case MBCTYPE_EUC: - case MBCTYPE_SJIS: - /* double byte char only */ return i + ((pos - i) & ~1); + + case MBCTYPE_SJIS: + while (i + (w = mbclen(string[i])) < pos) { + i += w; + } + return i; + case MBCTYPE_UTF8: + return i; default: return pos; } -- 小迫@ソフネック 渋谷区恵比寿1-15-1