]> granicus.if.org Git - onig/commitdiff
fix match fail for ignore case
authorK.Kosako <kkosako0@gmail.com>
Fri, 4 Oct 2019 14:45:17 +0000 (23:45 +0900)
committerK.Kosako <kkosako0@gmail.com>
Fri, 4 Oct 2019 14:45:17 +0000 (23:45 +0900)
src/regcomp.c
src/regexec.c

index 52f6f01b520f06f8ee7285485501c41c3d696ad2..24192a77b378f7052c1748f102b179922fa926e7 100644 (file)
@@ -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;
index 4bcd8a99e1fac1020dc135416f4b0f46735e396b..a60bb08344c1c2fd157ef22919f9b8be172d966f 100644 (file)
@@ -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;