summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-sprintf
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-11-19 02:16:47 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-11-19 22:49:50 +0900
commit1a9b607a4d92d0803402799b090785cfb83f02a7 (patch)
tree3df1a84a0533531515bc47c629c546821d8c2c27 /mrbgems/mruby-sprintf
parent8229f340988d83287f57b5982198302e168e41d3 (diff)
downloadmruby-1a9b607a4d92d0803402799b090785cfb83f02a7.tar.gz
mruby-1a9b607a4d92d0803402799b090785cfb83f02a7.zip
binary sprintf should not be restricted by mrb_int size; fix #3025
Diffstat (limited to 'mrbgems/mruby-sprintf')
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c21
-rw-r--r--mrbgems/mruby-sprintf/test/sprintf.rb1
2 files changed, 15 insertions, 7 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c
index 81b48b10d..28efab997 100644
--- a/mrbgems/mruby-sprintf/src/sprintf.c
+++ b/mrbgems/mruby-sprintf/src/sprintf.c
@@ -843,12 +843,10 @@ retry:
else {
val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
}
- v = mrb_fixnum(mrb_str_to_inum(mrb, val, 10, FALSE));
}
if (sign) {
char c = *p;
if (c == 'i') c = 'd'; /* %d and %i are identical */
- if (base == 2) c = 'd';
if (v < 0) {
v = -v;
sc = '-';
@@ -862,20 +860,29 @@ retry:
sc = ' ';
width--;
}
- snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
- snprintf(nbuf, sizeof(nbuf), fbuf, v);
+ if (base == 2) {
+ snprintf(nbuf, sizeof(nbuf), "%s", RSTRING_PTR(val));
+ }
+ else {
+ snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
+ snprintf(nbuf, sizeof(nbuf), fbuf, v);
+ }
s = nbuf;
}
else {
char c = *p;
if (c == 'X') c = 'x';
- if (base == 2) c = 'd';
s = nbuf;
if (v < 0) {
dots = 1;
}
- snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
- snprintf(++s, sizeof(nbuf) - 1, fbuf, v);
+ if (base == 2) {
+ snprintf(++s, sizeof(nbuf) - 1, "%s", RSTRING_PTR(val));
+ }
+ else {
+ snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
+ snprintf(++s, sizeof(nbuf) - 1, fbuf, v);
+ }
if (v < 0) {
char d;
diff --git a/mrbgems/mruby-sprintf/test/sprintf.rb b/mrbgems/mruby-sprintf/test/sprintf.rb
index 7007df1fa..454c226e1 100644
--- a/mrbgems/mruby-sprintf/test/sprintf.rb
+++ b/mrbgems/mruby-sprintf/test/sprintf.rb
@@ -5,4 +5,5 @@ assert('String#%') do
assert_equal "one=1", "one=%d" % 1
assert_equal "1 one 1.0", "%d %s %3.1f" % [ 1, "one", 1.01 ]
assert_equal "123 < 456", "%{num} < %<str>s" % { num: 123, str: "456" }
+ assert_equal 16, ("%b" % (1<<15)).size
end