summaryrefslogtreecommitdiff
path: root/re.c
diff options
context:
space:
mode:
authorS-H-GAMELINKS <gamelinks007@gmail.com>2022-10-22 18:26:53 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-10-23 17:38:59 +0900
commit1e06ef1328880bf39a7e6d757678be619c21f0c1 (patch)
tree897161510a307d24e56eedb94a957034dc58cbfb /re.c
parent86450d03a8c1570571c20452578cb923060e1d1f (diff)
downloadruby-1e06ef1328880bf39a7e6d757678be619c21f0c1.tar.gz
Introduce rb_memsearch_with_char_size function
Diffstat (limited to 're.c')
-rw-r--r--re.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/re.c b/re.c
index f52492245e..d66f389c6f 100644
--- a/re.c
+++ b/re.c
@@ -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)
@@ -234,16 +239,15 @@ rb_memsearch_wchar(const unsigned char *xs, long m, const unsigned char *ys, lon
}
static inline long
-rb_memsearch_qchar(const unsigned char *xs, long m, const unsigned char *ys, long n)
+rb_memsearch_wchar(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};
+ return rb_memsearch_with_char_size(xs, m, ys, n, WCHAR_SIZE);
+}
- 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;
+static inline long
+rb_memsearch_qchar(const unsigned char *xs, long m, const unsigned char *ys, long n)
+{
+ return rb_memsearch_with_char_size(xs, m, ys, n, QCHAR_SIZE);
}
long