[#15625] rb_hash_initialize — Takaaki Tateishi <ttate@...>

立石です.

22 messages 2002/01/04
[#15627] Re: rb_hash_initialize — matz@... (Yukihiro Matsumoto) 2002/01/04

まつもと ゆきひろです

[#15628] Re: rb_hash_initialize — Takaaki Tateishi <ttate@...> 2002/01/04

立石です.

[#15685] undefined method `inherited' for false (NameError) — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2002/01/15
[#15686] Re: undefined method `inherited' for false (NameError) — nobu.nakada@... 2002/01/15

なかだです。

[#15757] 文字列→整数変換 — nobu.nakada@...

なかだです。

30 messages 2002/01/25

[#15830] [ 提案 ] puts, print 等を IO から分離 — UENO Katsuhiro <unnie@...>

うえのです。

14 messages 2002/01/31

[ruby-dev:15814] Re: [PATCH] improve on \G

From: "K.Kosako" <kosako@...>
Date: 2002-01-30 05:48:34 UTC
List: ruby-dev #15814
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

In This Thread