From e6cd79cd31c5c3b096f4344ebef1958a7f32efb1 Mon Sep 17 00:00:00 2001 From: Erik Berlin Date: Thu, 26 Jun 2025 20:52:27 -0700 Subject: [PATCH] Consolidate octal and hexadecimal parsing logic Both ruby_scan_oct and ruby_scan_hex call the generic ruby_scan_digits helper, avoiding duplicate implementations. --- util.c | 37 ++++++++----------------------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/util.c b/util.c index 2e887618b1..3e8ae590a8 100644 --- a/util.c +++ b/util.c @@ -42,40 +42,19 @@ const char ruby_hexdigits[] = "0123456789abcdef0123456789ABCDEF"; unsigned long ruby_scan_oct(const char *start, size_t len, size_t *retlen) { - register const char *s = start; - register unsigned long retval = 0; - size_t i; - - for (i = 0; i < len; i++) { - if ((s[0] < '0') || ('7' < s[0])) { - break; - } - retval <<= 3; - retval |= *s++ - '0'; - } - *retlen = (size_t)(s - start); - return retval; + int overflow; + unsigned long val = ruby_scan_digits(start, (ssize_t)len, 8, retlen, &overflow); + (void)overflow; + return val; } unsigned long ruby_scan_hex(const char *start, size_t len, size_t *retlen) { - register const char *s = start; - register unsigned long retval = 0; - signed char d; - size_t i = 0; - - for (i = 0; i < len; i++) { - d = ruby_digit36_to_number_table[(unsigned char)*s]; - if (d < 0 || 15 < d) { - break; - } - retval <<= 4; - retval |= d; - s++; - } - *retlen = (size_t)(s - start); - return retval; + int overflow; + unsigned long val = ruby_scan_digits(start, (ssize_t)len, 16, retlen, &overflow); + (void)overflow; + return val; } const signed char ruby_digit36_to_number_table[] = {