From 18e70b266f05faa7963c159842202e5c1ad4cc15 Mon Sep 17 00:00:00 2001 From: matz Date: Sat, 1 Mar 2008 00:38:33 +0000 Subject: * sprintf.c (rb_str_format): "%#.0o" should keep prefix where "%#.0x" should not. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15648 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ sprintf.c | 13 ++++++++----- test/ruby/test_sprintf_comb.rb | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3bb1a63e42..7189913f6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Mar 1 09:36:08 2008 Yukihiro Matsumoto + + * sprintf.c (rb_str_format): "%#.0o" should keep prefix where + "%#.0x" should not. + Sat Mar 1 02:35:08 2008 Nobuyoshi Nakada * bignum.c (big2str_find_n1): check integer overflow. diff --git a/sprintf.c b/sprintf.c index 0682c642cc..a100946aa7 100644 --- a/sprintf.c +++ b/sprintf.c @@ -684,18 +684,21 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) pp++; } } - if (prefix && !prefix[1]) { + if (prefix && !prefix[1]) { /* octal */ if (dots) { prefix = 0; } else if (len == 1 && *s == '0') { - if (flags & FPREC) len = 0; - prefix = 0; + len = 0; + if (flags & FPREC) prec--; } else if ((flags & FPREC) && (prec > len)) { prefix = 0; } } + else if (len == 1 && *s == '0') { + prefix = 0; + } if (prefix) { width -= strlen(prefix); } @@ -705,8 +708,8 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt) } else { if (prec < len) { - if ((flags & FPREC) && len == 1 && *s == '0') len = 0; - else prec = len; + if (!prefix && prec == 0 && len == 1 && *s == '0') len = 0; + prec = len; } width -= prec; } diff --git a/test/ruby/test_sprintf_comb.rb b/test/ruby/test_sprintf_comb.rb index ee748f765a..644a1dd0f4 100644 --- a/test/ruby/test_sprintf_comb.rb +++ b/test/ruby/test_sprintf_comb.rb @@ -145,7 +145,7 @@ class TestSprintfComb < Test::Unit::TestCase radix = 2 digitmap = {0 => '0', 1 => '1'} complement = !pl && !sp - prefix = '0b' if hs + prefix = '0b' if hs && v != 0 when 'd' radix = 10 digitmap = {} @@ -161,13 +161,13 @@ class TestSprintfComb < Test::Unit::TestCase digitmap = {} 16.times {|i| digitmap[i] = i.to_s(16).upcase } complement = !pl && !sp - prefix = '0X' if hs + prefix = '0X' if hs && v != 0 when 'x' radix = 16 digitmap = {} 16.times {|i| digitmap[i] = i.to_s(16) } complement = !pl && !sp - prefix = '0x' if hs + prefix = '0x' if hs && v != 0 else raise "unexpected type: #{type.inspect}" end -- cgit v1.2.3