From: "K.Kosako" Date: 2002-11-29T17:24:58+09:00 Subject: [ruby-dev:18973] Re: [ONIGURUMA] \S doesn't match multibyte char Yukihiro Matsumotoさんの <1038550684.556438.10927.nullmailer@picachu.netlab.jp>から > 1.7ではRSTRING(str)->ptrがNULLのことがあるので、以下のパッチ > が必要でした。 > > --- regexec.c 24 Apr 2002 07:50:39 -0000 1.1.1.1 > +++ regexec.c 29 Nov 2002 06:17:13 -0000 どうもすいません。ruby-bugs-jaの % ./ruby -e 'String.new.sub!(/\b/, "")' のことですよね。 私としては、以下のように直したいと思います。 rangeの意味は、forward searchのときには探索右端 + 1で作っているので。 --- regexec.c.orig Wed Apr 24 12:01:50 2002 +++ regexec.c Fri Nov 29 17:10:55 2002 @@ -2235,8 +2235,8 @@ regex_search(regex_t* reg, UChar* str, U reg->state++; /* increment as search counter */ #ifdef REG_DEBUG_SEARCH - fprintf(stderr, "regex_search (entry point): end: %d, start: %d, range: %d\n", - (int )(end - str), (int )(start - str), (int )(range - str)); + fprintf(stderr, "regex_search (entry point): str: %d, end: %d, start: %d, range: %d\n", + (int )str, (int )(end - str), (int )(start - str), (int )(range - str)); #endif r = regex_region_resize(region, reg->max_mem + 1); @@ -2244,6 +2244,13 @@ regex_search(regex_t* reg, UChar* str, U if (start > end || start < str) goto mismatch; +#define MATCH_AND_RETURN_CHECK \ + r = match_at(reg, str, end, s, prev, region, &msa);\ + if (r != REG_MISMATCH) {\ + if (r >= 0) goto match;\ + goto finish; /* error */ \ + } + /* anchor optimize: resume search range */ if (reg->anchor != 0 && str < end) { UChar* semi_end; @@ -2320,19 +2327,24 @@ regex_search(regex_t* reg, UChar* str, U goto begin_position; } } + else if (str == end) { /* empty string */ + static UChar* address_for_empty_string = ""; #ifdef REG_DEBUG_SEARCH - fprintf(stderr, "regex_search(apply anchor): end: %d, start: %d, range: %d\n", - (int )(end - str), (int )(start - str), (int )(range - str)); + fprintf(stderr, "regex_search: empty string.\n"); #endif -#define MATCH_AND_RETURN_CHECK \ - r = match_at(reg, str, end, s, prev, region, &msa);\ - if (r != REG_MISMATCH) {\ - if (r >= 0) goto match;\ - goto finish; /* error */ \ + s = start = end = str = address_for_empty_string; + prev = (UChar* )NULL; + MATCH_AND_RETURN_CHECK; + goto mismatch; } +#ifdef REG_DEBUG_SEARCH + fprintf(stderr, "regex_search(apply anchor): end: %d, start: %d, range: %d\n", + (int )(end - str), (int )(start - str), (int )(range - str)); +#endif + s = start; if (range > start) { /* forward search */ if (s > str) -- 小迫@ソフネック 渋谷区恵比寿1-15-1