diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-08-31 09:52:20 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-08-31 09:52:20 +0000 |
commit | de11b8dc8a567f0dcb3961d4e712d63df97eaabb (patch) | |
tree | 2b8aba5e64384e438ef1d4932d7dc846e52fbdc4 | |
parent | 831a09696e25eee391a82dd32da4d6e81d459c71 (diff) | |
download | ruby-de11b8dc8a567f0dcb3961d4e712d63df97eaabb.tar.gz |
bm_search
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@291 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | regex.c | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -2000,7 +2000,6 @@ re_compile_pattern(pattern, size, bufp) /* set optimize flags */ laststart = bufp->buffer; - if (*laststart == exactn) bufp->options |= RE_OPTIMIZE_EXACTN; if (*laststart == start_memory) laststart += 3; if (*laststart == dummy_failure_jump) laststart += 3; else if (*laststart == try_next) laststart += 3; @@ -2025,18 +2024,25 @@ re_compile_pattern(pattern, size, bufp) bufp->used = b - bufp->buffer; bufp->re_nsub = regnum; - bufp->must = calculate_must_string(bufp->buffer, b); - if (current_mbctype) bufp->options |= RE_OPTIMIZE_NO_BM; + if (*bufp->buffer == exactn) { + bufp->options |= RE_OPTIMIZE_EXACTN; + bufp->must = bufp->buffer+1; + } + else { + bufp->must = calculate_must_string(bufp->buffer, b); + } + if (current_mbctype == MBCTYPE_SJIS) bufp->options |= RE_OPTIMIZE_NO_BM; else if (bufp->must) { - int i; - int len = ((unsigned char)bufp->must[0]); + int i; + int len = (unsigned char)bufp->must[0]; - for (i=1; i<len; i++) { - if ((unsigned char)bufp->must[i] == 0xff) { - bufp->options |= RE_OPTIMIZE_NO_BM; - break; - } + for (i=1; i<len; i++) { + if ((unsigned char)bufp->must[i] == 0xff || + (current_mbctype == MBCTYPE_EUC && ismbchar(bufp->must[i]))) { + bufp->options |= RE_OPTIMIZE_NO_BM; + break; } + } } FREE_AND_RETURN(stackb, 0); |