diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-02-22 19:07:07 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-02-22 19:07:07 -0800 |
| commit | 58b9e7672474160df90ba11c915eeac093fe12d2 (patch) | |
| tree | 73c7b5ca6756211785d607e312d1456e05fd0ded | |
| parent | 9b4e8e56d1a89f74572c3f5c92002fde131224c4 (diff) | |
| parent | 9acc7532978aedbd8cf956757b3d37751d5630ab (diff) | |
| download | mruby-58b9e7672474160df90ba11c915eeac093fe12d2.tar.gz mruby-58b9e7672474160df90ba11c915eeac093fe12d2.zip | |
Merge pull request #872 from monaka/pr-fix-mrb_fix2str
Fix mrb_fix2str().
| -rw-r--r-- | src/numeric.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/src/numeric.c b/src/numeric.c index 14be04408..b5bff652d 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -1204,36 +1204,28 @@ fix_minus(mrb_state *mrb, mrb_value self) mrb_value mrb_fix2str(mrb_state *mrb, mrb_value x, int base) { - char buf[sizeof(mrb_int)*CHAR_BIT+2], *b = buf + sizeof buf; + char buf[sizeof(mrb_int)*CHAR_BIT+1]; + char *b = buf + sizeof buf; mrb_int val = mrb_fixnum(x); - int neg = 0; if (base < 2 || 36 < base) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base); } + if (val == 0) { - return mrb_str_new(mrb, "0", 1); - } - if (val < 0) { - val = -val; - neg = 1; - } - *--b = '\0'; - if (neg && val < 0) { + *--b = '0'; + } else if (val < 0) { do { - *--b = mrb_digitmap[abs(val % base)]; + *--b = mrb_digitmap[-(val % base)]; } while (val /= base); - } - else { + *--b = '-'; + } else { do { *--b = mrb_digitmap[(int)(val % base)]; } while (val /= base); } - if (neg) { - *--b = '-'; - } - return mrb_str_new2(mrb, b); + return mrb_str_new(mrb, b, buf + sizeof(buf) - b); } /* 15.2.8.3.25 */ |
