mirror of
https://github.com/ruby/ruby.git
synced 2026-01-26 12:14:51 +00:00
Remove old code for BMH search
Remove the code for Boyer-Moore-Horspool search.
Now we are using Sunday's quick search.
3d9072419a
This commit is contained in:
parent
a89246834d
commit
ba74fcd6e1
Notes:
git
2025-10-31 11:50:37 +00:00
84
regcomp.c
84
regcomp.c
@ -4213,89 +4213,6 @@ restart:
|
||||
return r;
|
||||
}
|
||||
|
||||
#ifndef USE_SUNDAY_QUICK_SEARCH
|
||||
/* set skip map for Boyer-Moore search */
|
||||
static int
|
||||
set_bm_skip(UChar* s, UChar* end, regex_t* reg,
|
||||
UChar skip[], int** int_skip, int ignore_case)
|
||||
{
|
||||
OnigDistance i, len;
|
||||
int clen, flen, n, j, k;
|
||||
UChar *p, buf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
|
||||
OnigCaseFoldCodeItem items[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM];
|
||||
OnigEncoding enc = reg->enc;
|
||||
|
||||
len = end - s;
|
||||
if (len < ONIG_CHAR_TABLE_SIZE) {
|
||||
for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) skip[i] = (UChar )len;
|
||||
|
||||
n = 0;
|
||||
for (i = 0; i < len - 1; i += clen) {
|
||||
p = s + i;
|
||||
if (ignore_case)
|
||||
n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag,
|
||||
p, end, items);
|
||||
clen = enclen(enc, p, end);
|
||||
if (p + clen > end)
|
||||
clen = (int )(end - p);
|
||||
|
||||
for (j = 0; j < n; j++) {
|
||||
if ((items[j].code_len != 1) || (items[j].byte_len != clen))
|
||||
return 1; /* different length isn't supported. */
|
||||
flen = ONIGENC_CODE_TO_MBC(enc, items[j].code[0], buf[j]);
|
||||
if (flen != clen)
|
||||
return 1; /* different length isn't supported. */
|
||||
}
|
||||
for (j = 0; j < clen; j++) {
|
||||
skip[s[i + j]] = (UChar )(len - 1 - i - j);
|
||||
for (k = 0; k < n; k++) {
|
||||
skip[buf[k][j]] = (UChar )(len - 1 - i - j);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
# if OPT_EXACT_MAXLEN < ONIG_CHAR_TABLE_SIZE
|
||||
/* This should not happen. */
|
||||
return ONIGERR_TYPE_BUG;
|
||||
# else
|
||||
if (IS_NULL(*int_skip)) {
|
||||
*int_skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);
|
||||
if (IS_NULL(*int_skip)) return ONIGERR_MEMORY;
|
||||
}
|
||||
for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) (*int_skip)[i] = (int )len;
|
||||
|
||||
n = 0;
|
||||
for (i = 0; i < len - 1; i += clen) {
|
||||
p = s + i;
|
||||
if (ignore_case)
|
||||
n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag,
|
||||
p, end, items);
|
||||
clen = enclen(enc, p, end);
|
||||
if (p + clen > end)
|
||||
clen = (int )(end - p);
|
||||
|
||||
for (j = 0; j < n; j++) {
|
||||
if ((items[j].code_len != 1) || (items[j].byte_len != clen))
|
||||
return 1; /* different length isn't supported. */
|
||||
flen = ONIGENC_CODE_TO_MBC(enc, items[j].code[0], buf[j]);
|
||||
if (flen != clen)
|
||||
return 1; /* different length isn't supported. */
|
||||
}
|
||||
for (j = 0; j < clen; j++) {
|
||||
(*int_skip)[s[i + j]] = (int )(len - 1 - i - j);
|
||||
for (k = 0; k < n; k++) {
|
||||
(*int_skip)[buf[k][j]] = (int )(len - 1 - i - j);
|
||||
}
|
||||
}
|
||||
}
|
||||
# endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else /* USE_SUNDAY_QUICK_SEARCH */
|
||||
|
||||
/* set skip map for Sunday's quick search */
|
||||
static int
|
||||
set_bm_skip(UChar* s, UChar* end, regex_t* reg,
|
||||
@ -4397,7 +4314,6 @@ endcheck:
|
||||
}
|
||||
return (int)len;
|
||||
}
|
||||
#endif /* USE_SUNDAY_QUICK_SEARCH */
|
||||
|
||||
typedef struct {
|
||||
OnigDistance min; /* min byte length */
|
||||
|
||||
214
regexec.c
214
regexec.c
@ -4377,219 +4377,6 @@ slow_search_backward_ic(OnigEncoding enc, int case_fold_flag,
|
||||
return (UChar* )NULL;
|
||||
}
|
||||
|
||||
#ifndef USE_SUNDAY_QUICK_SEARCH
|
||||
/* Boyer-Moore-Horspool search applied to a multibyte string */
|
||||
static UChar*
|
||||
bm_search_notrev(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;
|
||||
ptrdiff_t skip, tlen1;
|
||||
|
||||
# ifdef ONIG_DEBUG_SEARCH
|
||||
fprintf(stderr, "bm_search_notrev: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n",
|
||||
(uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range);
|
||||
# endif
|
||||
|
||||
tail = target_end - 1;
|
||||
tlen1 = tail - target;
|
||||
end = text_range;
|
||||
if (end + tlen1 > text_end)
|
||||
end = text_end - tlen1;
|
||||
|
||||
s = text;
|
||||
|
||||
if (IS_NULL(reg->int_map)) {
|
||||
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, end);
|
||||
} while ((s - t) < skip && s < end);
|
||||
}
|
||||
}
|
||||
else {
|
||||
# if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE
|
||||
while (s < end) {
|
||||
p = se = s + tlen1;
|
||||
t = tail;
|
||||
while (*p == *t) {
|
||||
if (t == target) return (UChar* )s;
|
||||
p--; t--;
|
||||
}
|
||||
skip = reg->int_map[*se];
|
||||
t = s;
|
||||
do {
|
||||
s += enclen(reg->enc, s, end);
|
||||
} while ((s - t) < skip && s < end);
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
return (UChar* )NULL;
|
||||
}
|
||||
|
||||
/* Boyer-Moore-Horspool search */
|
||||
static UChar*
|
||||
bm_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;
|
||||
|
||||
# ifdef ONIG_DEBUG_SEARCH
|
||||
fprintf(stderr, "bm_search: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n",
|
||||
(uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range);
|
||||
# endif
|
||||
|
||||
end = text_range + (target_end - target) - 1;
|
||||
if (end > text_end)
|
||||
end = text_end;
|
||||
|
||||
tail = target_end - 1;
|
||||
s = text + (target_end - target) - 1;
|
||||
if (IS_NULL(reg->int_map)) {
|
||||
while (s < end) {
|
||||
p = s;
|
||||
t = tail;
|
||||
# ifdef ONIG_DEBUG_SEARCH
|
||||
fprintf(stderr, "bm_search_loop: pos: %"PRIdPTR" %s\n",
|
||||
(intptr_t )(s - text), s);
|
||||
# endif
|
||||
while (*p == *t) {
|
||||
if (t == target) return (UChar* )p;
|
||||
p--; t--;
|
||||
}
|
||||
s += reg->map[*s];
|
||||
}
|
||||
}
|
||||
else { /* see int_map[] */
|
||||
# if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE
|
||||
while (s < end) {
|
||||
p = s;
|
||||
t = tail;
|
||||
while (*p == *t) {
|
||||
if (t == target) return (UChar* )p;
|
||||
p--; t--;
|
||||
}
|
||||
s += reg->int_map[*s];
|
||||
}
|
||||
# endif
|
||||
}
|
||||
return (UChar* )NULL;
|
||||
}
|
||||
|
||||
/* Boyer-Moore-Horspool search applied to a multibyte string (ignore case) */
|
||||
static UChar*
|
||||
bm_search_notrev_ic(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, *end;
|
||||
const UChar *tail;
|
||||
ptrdiff_t skip, tlen1;
|
||||
OnigEncoding enc = reg->enc;
|
||||
int case_fold_flag = reg->case_fold_flag;
|
||||
|
||||
# ifdef ONIG_DEBUG_SEARCH
|
||||
fprintf(stderr, "bm_search_notrev_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n",
|
||||
(int )text, text, (int )text_end, text_end, (int )text_range, text_range);
|
||||
# endif
|
||||
|
||||
tail = target_end - 1;
|
||||
tlen1 = tail - target;
|
||||
end = text_range;
|
||||
if (end + tlen1 > text_end)
|
||||
end = text_end - tlen1;
|
||||
|
||||
s = text;
|
||||
|
||||
if (IS_NULL(reg->int_map)) {
|
||||
while (s < end) {
|
||||
se = s + tlen1;
|
||||
if (str_lower_case_match(enc, case_fold_flag, target, target_end,
|
||||
s, se + 1))
|
||||
return (UChar* )s;
|
||||
skip = reg->map[*se];
|
||||
t = s;
|
||||
do {
|
||||
s += enclen(reg->enc, s, end);
|
||||
} while ((s - t) < skip && s < end);
|
||||
}
|
||||
}
|
||||
else {
|
||||
# if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE
|
||||
while (s < end) {
|
||||
se = s + tlen1;
|
||||
if (str_lower_case_match(enc, case_fold_flag, target, target_end,
|
||||
s, se + 1))
|
||||
return (UChar* )s;
|
||||
skip = reg->int_map[*se];
|
||||
t = s;
|
||||
do {
|
||||
s += enclen(reg->enc, s, end);
|
||||
} while ((s - t) < skip && s < end);
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
return (UChar* )NULL;
|
||||
}
|
||||
|
||||
/* Boyer-Moore-Horspool search (ignore case) */
|
||||
static UChar*
|
||||
bm_search_ic(regex_t* reg, const UChar* target, const UChar* target_end,
|
||||
const UChar* text, const UChar* text_end, const UChar* text_range)
|
||||
{
|
||||
const UChar *s, *p, *end;
|
||||
const UChar *tail;
|
||||
OnigEncoding enc = reg->enc;
|
||||
int case_fold_flag = reg->case_fold_flag;
|
||||
|
||||
# ifdef ONIG_DEBUG_SEARCH
|
||||
fprintf(stderr, "bm_search_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n",
|
||||
(int )text, text, (int )text_end, text_end, (int )text_range, text_range);
|
||||
# endif
|
||||
|
||||
end = text_range + (target_end - target) - 1;
|
||||
if (end > text_end)
|
||||
end = text_end;
|
||||
|
||||
tail = target_end - 1;
|
||||
s = text + (target_end - target) - 1;
|
||||
if (IS_NULL(reg->int_map)) {
|
||||
while (s < end) {
|
||||
p = s - (target_end - target) + 1;
|
||||
if (str_lower_case_match(enc, case_fold_flag, target, target_end,
|
||||
p, s + 1))
|
||||
return (UChar* )p;
|
||||
s += reg->map[*s];
|
||||
}
|
||||
}
|
||||
else { /* see int_map[] */
|
||||
# if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE
|
||||
while (s < end) {
|
||||
p = s - (target_end - target) + 1;
|
||||
if (str_lower_case_match(enc, case_fold_flag, target, target_end,
|
||||
p, s + 1))
|
||||
return (UChar* )p;
|
||||
s += reg->int_map[*s];
|
||||
}
|
||||
# endif
|
||||
}
|
||||
return (UChar* )NULL;
|
||||
}
|
||||
|
||||
#else /* USE_SUNDAY_QUICK_SEARCH */
|
||||
|
||||
/* Sunday's quick search applied to a multibyte string */
|
||||
static UChar*
|
||||
bm_search_notrev(regex_t* reg, const UChar* target, const UChar* target_end,
|
||||
@ -4808,7 +4595,6 @@ bm_search_ic(regex_t* reg, const UChar* target, const UChar* target_end,
|
||||
}
|
||||
return (UChar* )NULL;
|
||||
}
|
||||
#endif /* USE_SUNDAY_QUICK_SEARCH */
|
||||
|
||||
#ifdef USE_INT_MAP_BACKWARD
|
||||
static int
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user