diff options
Diffstat (limited to 'mrbgems/mruby-sprintf/src/sprintf.c')
| -rw-r--r-- | mrbgems/mruby-sprintf/src/sprintf.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index 97e821c2f..411aec295 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -75,19 +75,35 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) { char buf[66], *b = buf + sizeof buf; mrb_int num = mrb_integer(x); + const int mask = base -1; + int shift; +#ifdef MRB_INT64 uint64_t val = (uint64_t)num; +#else + uint32_t val = (uint32_t)num; +#endif char d; - if (base != 2) { + switch (base) { + case 2: + shift = 1; + break; + case 8: + shift = 3; + break; + case 16: + shift = 4; + break; + default: mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base); } - if (val == 0) { + if (num == 0) { return mrb_str_new_lit(mrb, "0"); } *--b = '\0'; do { - *--b = mrb_digitmap[(int)(val % base)]; - } while (val /= base); + *--b = mrb_digitmap[(int)(val & mask)]; + } while (val >>= shift); if (num < 0) { b = remove_sign_bits(b, base); @@ -944,21 +960,6 @@ retry: val = mrb_fixnum_to_str(mrb, mrb_int_value(mrb, v), base); } strncpy(++s, RSTRING_PTR(val), sizeof(nbuf)-2); - if (v < 0) { - char d; - - s = remove_sign_bits(s, base); - switch (base) { - case 16: d = 'f'; break; - case 8: d = '7'; break; - case 2: d = '1'; break; - default: d = 0; break; - } - - if (d && *s != d) { - *--s = d; - } - } } { size_t size; |
