From: nobu.nakada@... Date: 2002-04-19T07:58:20+09:00 Subject: [ruby-dev:16968] Re: Regexp#to_s なかだです。 At Fri, 19 Apr 2002 00:24:36 +0900, Tanaka Akira wrote: > > どのへんが抜けてるでしょう。 > > 気がついたのは character class です。 > (?:[(])|([)]) とか。実際には試してませんが。 うむむ。 > > > あるいは、regex.c に入っているパーザをどうにかして再利用するか。 > > > > re_compile_pattern()を使う、というのも実は考えたんですが。 めんどいのでこっちにしました。typoってたし。[ruby-dev:16960]か らのパッチです。 --- re.c~ Fri Apr 19 07:43:37 2002 +++ re.c Fri Apr 19 07:54:49 2002 @@ -438,5 +438,5 @@ rb_reg_to_s(re) len = RREGEXP(re)->len; if (len >= 4 && ptr[0] == '(' && ptr[1] == '?' && ptr[len-1] == ')') { - int nest = 0; + int err = 1; ptr += 2; if ((len -= 3) > 0) { @@ -473,26 +473,12 @@ rb_reg_to_s(re) } if (*ptr == ':') { - const char* p = ++ptr; - long l = --len; + Regexp *rp = ALLOC(Regexp); + MEMZERO((char *)rp, Regexp, 1); kcode_set_option(re); - while (len > 0) { - int n; - if (*p == '(') { - ++nest; - } - else if (*p == ')') { - if (--nest < 0) break; - } - else if (*p == '\\') { - --l; - ++p; - } - n = mbclen(*p); - l -= n; - p += n; - } + err = re_compile_pattern(++ptr, --len, rp) != 0; kcode_reset_option(); + re_free_pattern(rp); } - if (nest) { + if (err) { options = RREGEXP(re)->ptr->options; ptr = RREGEXP(re)->str; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦