From: K.Kosako Date: Fri, 4 Oct 2019 14:45:17 +0000 (+0900) Subject: fix match fail for ignore case X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13a1de29ffcf7b454154e1a9ef2a1473ae5402bd;p=onig fix match fail for ignore case --- diff --git a/src/regcomp.c b/src/regcomp.c index 52f6f01..24192a7 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -754,6 +754,9 @@ compile_length_string_node(Node* node, regex_t* reg) return 0; ambig = NODE_STRING_IS_AMBIG(node); + if (ambig != 0) { + return 1; + } p = prev = sn->s; prev_len = enclen(enc, p); @@ -791,6 +794,40 @@ compile_length_string_raw_node(StrNode* sn, regex_t* reg) reg, 0); } +static int +compile_ambig_string_node(Node* node, regex_t* reg) +{ + int r; + int len; + int byte_len; + UChar* p; + StrNode* sn; + OnigEncoding enc = reg->enc; + + sn = STR_(node); + len = enclen(enc, sn->s); + byte_len = sn->end - sn->s; + if (len == byte_len) { + r = add_op(reg, OP_EXACT1_IC); + if (r != 0) return r; + + xmemset(COP(reg)->exact.s, 0, sizeof(COP(reg)->exact.s)); + xmemcpy(COP(reg)->exact.s, sn->s, (size_t )byte_len); + } + else { + r = add_op(reg, OP_EXACTN_IC); + if (r != 0) return r; + + p = onigenc_strdup(enc, sn->s, sn->end); + CHECK_NULL_RETURN_MEMERR(p); + + COP(reg)->exact_n.s = p; + COP(reg)->exact_n.n = byte_len; + } + + return 0; +} + static int compile_string_node(Node* node, regex_t* reg) { @@ -805,6 +842,9 @@ compile_string_node(Node* node, regex_t* reg) end = sn->end; ambig = NODE_STRING_IS_AMBIG(node); + if (ambig != 0) { + return compile_ambig_string_node(node, reg); + } p = prev = sn->s; prev_len = enclen(enc, p); @@ -6139,7 +6179,13 @@ set_optimize_exact(regex_t* reg, OptStr* e) reg->dmax = e->mmd.max; if (reg->dmin != INFINITE_LEN) { - reg->threshold_len = reg->dmin + (int )(reg->exact_end - reg->exact); + int n; + if (e->case_fold != 0 && e->good_case_fold == 0) + n = 1; + else + n = (int )(reg->exact_end - reg->exact); + + reg->threshold_len = reg->dmin + n; } return 0; diff --git a/src/regexec.c b/src/regexec.c index 4bcd8a9..a60bb08 100644 --- a/src/regexec.c +++ b/src/regexec.c @@ -4631,16 +4631,11 @@ slow_search_ic(OnigEncoding enc, int case_fold_flag, UChar* target, UChar* target_end, const UChar* text, const UChar* text_end, UChar* text_range) { - UChar *s, *end; - - end = (UChar* )text_end; - end -= target_end - target - 1; - if (end > text_range) - end = text_range; + UChar *s; s = (UChar* )text; - while (s < end) { + while (s < text_range) { if (str_lower_case_match(enc, case_fold_flag, target, target_end, s, text_end)) return s;