return r;
}
-#ifdef USE_SUNDAY_QUICK_SEARCH_ALGORITHM
static int
set_sunday_quick_search_skip_table(regex_t* reg, int case_expand,
UChar* s, UChar* end,
return 0;
}
-#else
-/* set skip map for Boyer-Moore-Horspool search */
-static int
-set_bmh_search_skip_table(UChar* s, UChar* end, OnigEncoding enc ARG_UNUSED,
- UChar skip[])
-{
- int i, len;
-
- len = (int )(end - s);
- if (len < UCHAR_MAX) {
- for (i = 0; i < CHAR_MAP_SIZE; i++) skip[i] = len;
-
- for (i = 0; i < len - 1; i++)
- skip[s[i]] = len - 1 - i;
-
- return 0;
- }
- else {
- return ONIGERR_PARSER_BUG;
- }
-}
-#endif /* USE_SUNDAY_QUICK_SEARCH_ALGORITHM */
#define OPT_EXACT_MAXLEN 24
if (e->case_fold) {
reg->optimize = OPTIMIZE_STR_CASE_FOLD;
-#ifdef USE_SUNDAY_QUICK_SEARCH_ALGORITHM
if (e->good_case_fold != 0) {
if (e->len >= 2) {
r = set_sunday_quick_search_skip_table(reg, 1,
reg->optimize = OPTIMIZE_STR_CASE_FOLD_FAST;
}
}
-#endif
}
else {
int allow_reverse;
ONIGENC_IS_ALLOWED_REVERSE_MATCH(reg->enc, reg->exact, reg->exact_end);
if (e->len >= 2 || (e->len >= 1 && allow_reverse)) {
-#ifdef USE_SUNDAY_QUICK_SEARCH_ALGORITHM
r = set_sunday_quick_search_skip_table(reg, 0, reg->exact, reg->exact_end,
reg->map, &(reg->map_offset));
-#else
- r = set_bmh_search_skip_table(reg->exact, reg->exact_end,
- reg->enc, reg->map);
-#endif
if (r != 0) return r;
reg->optimize = (allow_reverse != 0
return (UChar* )NULL;
}
-#ifdef USE_SUNDAY_QUICK_SEARCH_ALGORITHM
static UChar*
sunday_quick_search_step_forward(regex_t* reg,
return (UChar* )NULL;
}
-#else
-
-static UChar*
-bmh_search_step_forward(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, *t, *p, *end;
- const UChar *tail;
- int skip, tlen1;
-
-#ifdef ONIG_DEBUG_SEARCH
- fprintf(stderr,
- "bmh_search_step_forward: text: %p, text_end: %p, text_range: %p\n",
- text, text_end, text_range);
-#endif
-
- tail = target_end - 1;
- tlen1 = (int )(tail - target);
- end = text_range;
- if (end + tlen1 > text_end)
- end = text_end - tlen1;
-
- s = text;
-
- while (s < end) {
- p = se = s + tlen1;
- t = tail;
- while (*p == *t) {
- if (t == target) return (UChar* )s;
- p--; t--;
- }
- skip = reg->map[*se];
- t = s;
- do {
- s += enclen(reg->enc, s);
- } while ((s - t) < skip && s < end);
- }
-
- return (UChar* )NULL;
-}
-
-static UChar*
-bmh_search(regex_t* reg, const UChar* target, const UChar* target_end,
- const UChar* text, const UChar* text_end, const UChar* text_range)
-{
- const UChar *s, *t, *p, *end;
- const UChar *tail;
-
- end = text_range + (target_end - target);
- if (end > text_end)
- end = text_end;
-
- tail = target_end - 1;
- s = text + (tail - target);
-
- while (s < end) {
- p = s;
- t = tail;
- while (*p == *t) {
- if (t == target) return (UChar* )p;
- p--; t--;
- }
- s += reg->map[*s];
- }
-
- return (UChar* )NULL;
-}
-#endif /* USE_SUNDAY_QUICK_SEARCH_ALGORITHM */
-
static UChar*
map_search(OnigEncoding enc, UChar map[],
const UChar* text, const UChar* text_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);
-#else
- p = bmh_search(reg, reg->exact, reg->exact_end, p, end, range);
-#endif
break;
case OPTIMIZE_STR_FAST_STEP_FORWARD:
-#ifdef USE_SUNDAY_QUICK_SEARCH_ALGORITHM
p = sunday_quick_search_step_forward(reg, reg->exact, reg->exact_end,
p, end, range);
-#else
- p = bmh_search_step_forward(reg, reg->exact, reg->exact_end,
- p, end, range);
-#endif
break;
case OPTIMIZE_MAP: