From: nobu@... Date: 2005-07-11T00:53:06+09:00 Subject: [ruby-dev:26505] Re: can't handle \c\ なかだです。 At Mon, 11 Jul 2005 00:40:55 +0900, Yukihiro Matsumoto wrote in [ruby-dev:26503]: > |1.8だと > |p /[\c\\\]/ =~ "\034" #=> 0 > |のように文字クラスの中なら書けるようですが、 > |1.9だとだめでした。 > > 「だめでした」というのはいろいろ解釈できるのですが、こちらで > 試したところ > > * コンパイルは通る(p /[\c\\]/は/[\c\\]/と表示される) > * マッチはしない > > でした。鬼車のバグかな。 1.8も1.9もバグってますね。 Index: regex.c =================================================================== RCS file: /cvs/ruby/src/ruby/Attic/regex.c,v retrieving revision 1.96.2.5 diff -U2 -p -r1.96.2.5 regex.c --- regex.c 24 Apr 2005 16:23:42 -0000 1.96.2.5 +++ regex.c 10 Jul 2005 15:50:14 -0000 @@ -1163,5 +1163,5 @@ read_special(p, pend, pp) *pp = p; if (c == '\\') { - return read_special(p, pend, pp) | 0x80; + return read_special(--p, pend, pp) | 0x80; } else if (c == -1) return ~0; @@ -1177,5 +1177,5 @@ read_special(p, pend, pp) *pp = p; if (c == '\\') { - c = read_special(p, pend, pp); + c = read_special(--p, pend, pp); } else if (c == '?') return 0177; @@ -1183,4 +1183,5 @@ read_special(p, pend, pp) return c & 0x9f; default: + *pp = p + 1; return read_backslash(c); } @@ -1578,5 +1579,5 @@ re_compile_pattern(pattern, size, bufp) case 'c': { - char *pp; + const char *pp; --p; Index: regparse.c =================================================================== RCS file: /cvs/ruby/src/ruby/regparse.c,v retrieving revision 1.18 diff -U2 -p -r1.18 regparse.c --- regparse.c 28 Jun 2005 15:06:03 -0000 1.18 +++ regparse.c 10 Jul 2005 15:30:31 -0000 @@ -2362,5 +2362,5 @@ fetch_escaped_value(UChar** src, UChar* v = fetch_escaped_value(&p, end, env); if (v < 0) return v; - c = (OnigCodePoint )v; + c = (OnigCodePoint )(v & 0x9f); } else if (c == '?') -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦