summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-sprintf
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-01-02 16:42:16 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-01-02 20:28:29 +0900
commitd55367582c6fa1c63a32530a9b55f37e0086f354 (patch)
treef264c0f53a1b736724b15100ad795395c3c3b2e6 /mrbgems/mruby-sprintf
parentb151a697e09b2088db3d1f86f355f32fb60f9691 (diff)
downloadmruby-d55367582c6fa1c63a32530a9b55f37e0086f354.tar.gz
mruby-d55367582c6fa1c63a32530a9b55f37e0086f354.zip
Allow negative integer value formatting in base 8 and 16.
Diffstat (limited to 'mrbgems/mruby-sprintf')
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c24
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);