Allow negative integer value formatting in base 8 and 16.

parent b151a697
...@@ -75,19 +75,35 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base) ...@@ -75,19 +75,35 @@ mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
{ {
char buf[66], *b = buf + sizeof buf; char buf[66], *b = buf + sizeof buf;
mrb_int num = mrb_integer(x); mrb_int num = mrb_integer(x);
const int mask = base -1;
int shift;
#ifdef MRB_INT64
uint64_t val = (uint64_t)num; uint64_t val = (uint64_t)num;
#else
uint32_t val = (uint32_t)num;
#endif
char d; 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); mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base);
} }
if (val == 0) { if (num == 0) {
return mrb_str_new_lit(mrb, "0"); return mrb_str_new_lit(mrb, "0");
} }
*--b = '\0'; *--b = '\0';
do { do {
*--b = mrb_digitmap[(int)(val % base)]; *--b = mrb_digitmap[(int)(val & mask)];
} while (val /= base); } while (val >>= shift);
if (num < 0) { if (num < 0) {
b = remove_sign_bits(b, base); b = remove_sign_bits(b, base);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment