mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Consolidate octal and hexadecimal parsing logic
Both ruby_scan_oct and ruby_scan_hex call the generic ruby_scan_digits helper, avoiding duplicate implementations.
This commit is contained in:
parent
8e75a36129
commit
e6cd79cd31
1 changed files with 8 additions and 29 deletions
37
util.c
37
util.c
|
@ -42,40 +42,19 @@ const char ruby_hexdigits[] = "0123456789abcdef0123456789ABCDEF";
|
||||||
unsigned long
|
unsigned long
|
||||||
ruby_scan_oct(const char *start, size_t len, size_t *retlen)
|
ruby_scan_oct(const char *start, size_t len, size_t *retlen)
|
||||||
{
|
{
|
||||||
register const char *s = start;
|
int overflow;
|
||||||
register unsigned long retval = 0;
|
unsigned long val = ruby_scan_digits(start, (ssize_t)len, 8, retlen, &overflow);
|
||||||
size_t i;
|
(void)overflow;
|
||||||
|
return val;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long
|
unsigned long
|
||||||
ruby_scan_hex(const char *start, size_t len, size_t *retlen)
|
ruby_scan_hex(const char *start, size_t len, size_t *retlen)
|
||||||
{
|
{
|
||||||
register const char *s = start;
|
int overflow;
|
||||||
register unsigned long retval = 0;
|
unsigned long val = ruby_scan_digits(start, (ssize_t)len, 16, retlen, &overflow);
|
||||||
signed char d;
|
(void)overflow;
|
||||||
size_t i = 0;
|
return val;
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const signed char ruby_digit36_to_number_table[] = {
|
const signed char ruby_digit36_to_number_table[] = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue