Introduce rb_memsearch_with_char_size function

This commit is contained in:
S-H-GAMELINKS 2022-10-22 18:26:53 +09:00 committed by Nobuyoshi Nakada
parent 86450d03a8
commit 1e06ef1328
Notes: git 2022-10-23 08:39:24 +00:00

24
re.c
View File

@ -220,11 +220,16 @@ rb_memsearch_qs_utf8(const unsigned char *xs, long m, const unsigned char *ys, l
return -1;
}
enum char_size
{
WCHAR_SIZE = 2,
QCHAR_SIZE = 4
};
static inline long
rb_memsearch_wchar(const unsigned char *xs, long m, const unsigned char *ys, long n)
rb_memsearch_with_char_size(const unsigned char *xs, long m, const unsigned char *ys, long n, enum char_size char_size)
{
const unsigned char *x = xs, x0 = *xs, *y = ys;
enum {char_size = 2};
for (n -= m; n >= 0; n -= char_size, y += char_size) {
if (x0 == *y && memcmp(x+1, y+1, m-1) == 0)
@ -233,17 +238,16 @@ rb_memsearch_wchar(const unsigned char *xs, long m, const unsigned char *ys, lon
return -1;
}
static inline long
rb_memsearch_wchar(const unsigned char *xs, long m, const unsigned char *ys, long n)
{
return rb_memsearch_with_char_size(xs, m, ys, n, WCHAR_SIZE);
}
static inline long
rb_memsearch_qchar(const unsigned char *xs, long m, const unsigned char *ys, long n)
{
const unsigned char *x = xs, x0 = *xs, *y = ys;
enum {char_size = 4};
for (n -= m; n >= 0; n -= char_size, y += char_size) {
if (x0 == *y && memcmp(x+1, y+1, m-1) == 0)
return y - ys;
}
return -1;
return rb_memsearch_with_char_size(xs, m, ys, n, QCHAR_SIZE);
}
long