From 916fd642fabf1edbcf9a6e2c476663c17198fffd Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 21 May 2022 16:14:16 +0900 Subject: [PATCH] string.c (mrb_utf8len): unroll a for loop. --- src/string.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/string.c b/src/string.c index 95a914149..b779d6230 100644 --- a/src/string.c +++ b/src/string.c @@ -256,15 +256,20 @@ mrb_int mrb_utf8len(const char* p, const char* e) { mrb_int len; - mrb_int i; if ((unsigned char)*p < 0x80) return 1; len = utf8len_codepage[(unsigned char)*p]; - if (len == 1) return 1; if (len > e - p) return 1; - for (i = 1; i < len; ++i) - if (utf8_islead(p[i])) - return 1; + switch (len) { + case 1: + return 1; + case 4: + if (utf8_islead(p[3])) return 1; + case 3: + if (utf8_islead(p[2])) return 1; + case 2: + if (utf8_islead(p[1])) return 1; + } return len; } @@ -274,10 +279,9 @@ mrb_utf8_strlen(const char *str, mrb_int byte_len) mrb_int len = 0; const char *p = str; const char *e = p + byte_len; - while (p < e) { - p += mrb_utf8len(p, e); - len++; + if (utf8_islead(*p)) len++; + p++; } return len; }