summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-sprintf/src/sprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-sprintf/src/sprintf.c')
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c39
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;