diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | bignum.c | 41 |
2 files changed, 35 insertions, 10 deletions
@@ -1,3 +1,7 @@ +Fri Aug 16 15:37:04 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net> + + * bignum.c (rb_cstr_to_inum): new decimal and octal string. + Fri Aug 16 11:47:24 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net> * io.c (rb_io_fread): renamed from io_fread and made extern. @@ -340,13 +340,20 @@ rb_cstr_to_inum(str, base, badcheck) } if (base <= 0) { if (str[0] == '0') { - if (str[1] == 'x' || str[1] == 'X') { + switch (str[1]) { + case 'x': case 'X': base = 16; - } - else if (str[1] == 'b' || str[1] == 'B') { + break; + case 'b': case 'B': base = 2; - } - else { + break; + case 'o': case 'O': + base = 8; + break; + case 'd': case 'D': + base = 10; + break; + default: base = 8; } } @@ -357,17 +364,31 @@ rb_cstr_to_inum(str, base, badcheck) base = 10; } } - if (base == 8) { + switch (base) { + case 2: + len = 1; + if (str[0] == '0' && (str[1] == 'b'||str[1] == 'B')) { + str += 2; + } + break; + case 8: len = 3; - } - else { /* base == 10, 2 or 16 */ - if (base == 16 && str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) { + if (str[0] == '0' && (str[1] == 'o'||str[1] == 'O')) { str += 2; } - else if (base == 2 && str[0] == '0' && (str[1] == 'b'||str[1] == 'B')) { + break; + case 10: + len = 4; + if (str[0] == '0' && (str[1] == 'd'||str[1] == 'D')) { str += 2; } + break; + case 16: len = 4; + if (str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) { + str += 2; + } + break; } if (*str == '0') { /* squeeze preceeding 0s */ while (*++str == '0'); |