From dee1ded7b5f047f08aa4cc9a71dcdf0d8c3e7fe9 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 27 Jan 2024 06:23:16 +0900 Subject: [PATCH] string.c (mrb_memsearch_ss): support bigendians --- src/string.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/string.c b/src/string.c index 5c3ef90cd..d0805758a 100644 --- a/src/string.c +++ b/src/string.c @@ -572,6 +572,7 @@ str_index_str_by_char(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos) * takes unsigned char* * returns mrb_int * alignment adjustment added + * support bigendian CPU */ static inline mrb_int mrb_memsearch_ss(const unsigned char *xs, long m, const unsigned char *ys, long n) @@ -587,6 +588,15 @@ mrb_memsearch_ss(const unsigned char *xs, long m, const unsigned char *ys, long #define MASK2 0x7f7f7f7flu #define MASK3 0x80808080lu #endif +#if defined(MRB_ENDIAN_BIG) +#ifdef MRB_64BIT +#define MASK4 0x8000000000000000llu +#else +#define MASK4 0x80000000 +#endif +#else +#define MASK4 0x80 +#endif #if ALIGNED_WORD_ACCESS if ((uintptr_t)ys % sizeof(bitint)) { @@ -611,14 +621,18 @@ mrb_memsearch_ss(const unsigned char *xs, long m, const unsigned char *ys, long size_t j = 0; while (zeros) { - if (zeros & 0x80) { + if (zeros & MASK4) { const char* substr = (char*)s0 + j + 1; if (memcmp(substr, xs + 1, m - 2) == 0) { return i + j; } } +#if defined(MRB_ENDIAN_BIG) + zeros <<= 8; +#else zeros >>= 8; +#endif j += 1; } }