diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-11-19 02:16:47 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-11-19 22:49:50 +0900 |
| commit | 1a9b607a4d92d0803402799b090785cfb83f02a7 (patch) | |
| tree | 3df1a84a0533531515bc47c629c546821d8c2c27 /mrbgems/mruby-sprintf | |
| parent | 8229f340988d83287f57b5982198302e168e41d3 (diff) | |
| download | mruby-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.c | 21 | ||||
| -rw-r--r-- | mrbgems/mruby-sprintf/test/sprintf.rb | 1 |
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 |
