diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-01-02 16:42:16 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-01-02 20:28:29 +0900 |
| commit | d55367582c6fa1c63a32530a9b55f37e0086f354 (patch) | |
| tree | f264c0f53a1b736724b15100ad795395c3c3b2e6 /mrbgems/mruby-sprintf/src | |
| parent | b151a697e09b2088db3d1f86f355f32fb60f9691 (diff) | |
| download | mruby-d55367582c6fa1c63a32530a9b55f37e0086f354.tar.gz mruby-d55367582c6fa1c63a32530a9b55f37e0086f354.zip | |
Allow negative integer value formatting in base 8 and 16.
Diffstat (limited to 'mrbgems/mruby-sprintf/src')
| -rw-r--r-- | mrbgems/mruby-sprintf/src/sprintf.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index 97e821c2f..d4c689d9b 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); |
