diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-04-14 06:54:27 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-04-14 06:54:27 +0000 |
commit | 3f4472433d09fbeedaa9c41c7d76eb1299e31638 (patch) | |
tree | a4ad2e83d82088c8cd076830e3b25031d6ed061b /numeric.c | |
parent | d39d90f86ae5b61530dd76689921f31505290272 (diff) | |
download | ruby-3f4472433d09fbeedaa9c41c7d76eb1299e31638.tar.gz |
* bignum.c (rb_cstr_to_inum, rb_big2str): allow 2-36 as radix.
* numeric.c (rb_fix2str): ditto.
* string.c (rb_str_to_i): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3677 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r-- | numeric.c | 27 |
1 files changed, 18 insertions, 9 deletions
@@ -1178,21 +1178,30 @@ rb_fix2str(x, base) VALUE x; int base; { - char fmt[4], buf[22], *b = buf; + extern const char ruby_digitmap[]; + char buf[SIZEOF_LONG*CHAR_BIT/2 + 2], *b = buf + sizeof buf; long val = FIX2LONG(x); + int neg = 0; - fmt[0] = '%'; fmt[1] = 'l'; fmt[3] = '\0'; - if (base == 10) fmt[2] = 'd'; - else if (base == 16) fmt[2] = 'x'; - else if (base == 8) fmt[2] = 'o'; - else rb_raise(rb_eArgError, "illegal radix %d", base); + if (base < 2 || 36 < base) { + rb_raise(rb_eArgError, "illegal radix %d", base); + } + if (val == 0) { + return rb_str_new2("0"); + } if (val < 0) { val = -val; - *b++ = '-'; + neg = 1; + } + *--b = '\0'; + do { + *--b = ruby_digitmap[(int)(val % base)]; + } while (val /= base); + if (neg) { + *--b = '-'; } - sprintf(b, fmt, val); - return rb_str_new2(buf); + return rb_str_new2(b); } static VALUE |