]> granicus.if.org Git - onig/commitdiff
add OPTIMIZE_STR_CASE_FOLD_FAST
authorK.Kosako <kosako@sofnec.co.jp>
Tue, 2 Oct 2018 05:38:08 +0000 (14:38 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Tue, 2 Oct 2018 05:38:08 +0000 (14:38 +0900)
src/regexec.c
src/regint.h

index 192af20480572a2d08964829a5752326d3f4379f..378e2969fdca4b75aae2eae75e4e5d2bbbdc5524 100644 (file)
@@ -4116,8 +4116,8 @@ slow_search_backward_ic(OnigEncoding enc, int case_fold_flag,
 
 static UChar*
 sunday_quick_search_step_forward(regex_t* reg,
-                        const UChar* target, const UChar* target_end,
-                        const UChar* text, const UChar* text_end,
+                                 const UChar* target, const UChar* target_end,
+                                 const UChar* text, const UChar* text_end,
                                  const UChar* text_range)
 {
   const UChar *s, *se, *t, *p, *end;
@@ -4188,6 +4188,53 @@ sunday_quick_search(regex_t* reg, const UChar* target, const UChar* target_end,
   return (UChar* )NULL;
 }
 
+static UChar*
+sunday_quick_search_case_fold(regex_t* reg,
+                              const UChar* target, const UChar* target_end,
+                              const UChar* text,   const UChar* text_end,
+                              const UChar* text_range)
+{
+  const UChar *s, *se, *p, *end;
+  const UChar *tail;
+  int skip, tlen1;
+  int map_offset;
+  int case_fold_flag;
+  OnigEncoding enc;
+
+#ifdef ONIG_DEBUG_SEARCH
+  fprintf(stderr,
+          "sunday_quick_search_case_fold: text: %p, text_end: %p, text_range: %p\n", text, text_end, text_range);
+#endif
+
+  enc = reg->enc;
+  case_fold_flag = reg->case_fold_flag;
+
+  tail = target_end - 1;
+  tlen1 = (int )(tail - target);
+  end = text_range;
+  if (end + tlen1 > text_end)
+    end = text_end - tlen1;
+
+  map_offset = reg->map_offset;
+  s = text;
+
+  while (s < end) {
+    if (str_lower_case_match(enc, case_fold_flag, target, target_end,
+                             s, text_end))
+      return (UChar* )s;
+
+    se = s + tlen1;
+    if (se + map_offset >= text_end) break;
+    skip = reg->map[*(se + map_offset)];
+    p = s;
+    do {
+      s += enclen(reg->enc, s);
+    } while ((s - p) < skip && s < end);
+  }
+
+  return (UChar* )NULL;
+}
+
 #else
 
 static UChar*
@@ -4372,6 +4419,16 @@ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
                        reg->exact, reg->exact_end, p, end, range);
     break;
 
+  case OPTIMIZE_STR_CASE_FOLD_FAST:
+#ifdef USE_SUNDAY_QUICK_SEARCH_ALGORITHM
+    p = sunday_quick_search_case_fold(reg, reg->exact, reg->exact_end, p, end,
+                                      range);
+#else
+    p = slow_search_ic(reg->enc, reg->case_fold_flag,
+                       reg->exact, reg->exact_end, p, end, range);
+#endif
+    break;
+
   case OPTIMIZE_STR_FAST:
 #ifdef USE_SUNDAY_QUICK_SEARCH_ALGORITHM
     p = sunday_quick_search(reg, reg->exact, reg->exact_end, p, end, range);
@@ -4503,6 +4560,7 @@ backward_search_range(regex_t* reg, const UChar* str, const UChar* end,
     break;
 
   case OPTIMIZE_STR_CASE_FOLD:
+  case OPTIMIZE_STR_CASE_FOLD_FAST:
     p = slow_search_backward_ic(reg->enc, reg->case_fold_flag,
                                 reg->exact, reg->exact_end,
                                 range, adjrange, end, p);
index d7917769039835ebc0d9b51a324dc451626a0d36..fb7a4a4250f5dde39f77453dbd012561c2de87e6 100644 (file)
@@ -317,6 +317,7 @@ enum OptimizeType {
   OPTIMIZE_STR,                    /* Slow Search */
   OPTIMIZE_STR_FAST,               /* Sunday quick search or BMH */
   OPTIMIZE_STR_FAST_STEP_FORWARD,  /* Sunday quick search or BMH */
+  OPTIMIZE_STR_CASE_FOLD_FAST,     /* Sunday quick search (ignore case) */
   OPTIMIZE_STR_CASE_FOLD,          /* Slow Search (ignore case) */
   OPTIMIZE_MAP                     /* char map */
 };