ruby-changes:17497
From: naruse <ko1@a...>
Date: Fri, 15 Oct 2010 17:28:23 +0900 (JST)
Subject: [ruby-changes:17497] Ruby:r29502 (trunk): * sprintf.c (rb_str_format): fix: sprintf with hex format and
naruse 2010-10-15 17:28:12 +0900 (Fri, 15 Oct 2010) New Revision: 29502 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29502 Log: * sprintf.c (rb_str_format): fix: sprintf with hex format and precision includes wrong dots. Modified files: trunk/ChangeLog trunk/sprintf.c trunk/test/ruby/test_sprintf.rb trunk/test/ruby/test_sprintf_comb.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 29501) +++ ChangeLog (revision 29502) @@ -1,3 +1,8 @@ +Thu Oct 14 09:46:28 2010 NARUSE, Yui <naruse@r...> + + * sprintf.c (rb_str_format): fix: sprintf with hex format and + precision includes wrong dots. + Fri Oct 15 16:40:37 2010 NARUSE, Yui <naruse@r...> * pack.c (pack_pack): fix more than one modifiers appear in the Index: sprintf.c =================================================================== --- sprintf.c (revision 29501) +++ sprintf.c (revision 29502) @@ -844,7 +844,7 @@ } else { s = nbuf; - if (v < 0) { + if (v < 0 && !(flags & FPREC0)) { dots = 1; } snprintf(fbuf, sizeof(fbuf), "%%l%c", *p == 'X' ? 'x' : *p); @@ -892,7 +892,8 @@ tmp1 = tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val)); s = RSTRING_PTR(tmp); if (*s == '-') { - dots = 1; + if (!(flags & FPREC0)) + dots = 1; if (base == 10) { rb_warning("negative number for %%u specifier"); } @@ -925,14 +926,11 @@ } } if (prefix && !prefix[1]) { /* octal */ - if (dots) { - prefix = 0; - } - else if (len == 1 && *s == '0') { + if (len == 1 && *s == '0') { len = 0; if (flags & FPREC) prec--; } - else if ((flags & FPREC) && (prec > len)) { + else if ((flags & FPREC) && (prec > len) && v >= 0) { prefix = 0; } } Index: test/ruby/test_sprintf.rb =================================================================== --- test/ruby/test_sprintf.rb (revision 29501) +++ test/ruby/test_sprintf.rb (revision 29502) @@ -24,12 +24,12 @@ assert_equal("0000", sprintf("%.4b", 0)) assert_equal("0001", sprintf("%.4b", 1)) assert_equal("0010", sprintf("%.4b", 2)) - assert_equal("..11", sprintf("%.4b", -1)) + assert_equal("1111", sprintf("%.4b", -1)) assert_equal(" 0000", sprintf("%6.4b", 0)) assert_equal(" 0001", sprintf("%6.4b", 1)) assert_equal(" 0010", sprintf("%6.4b", 2)) - assert_equal(" ..11", sprintf("%6.4b", -1)) + assert_equal(" 1111", sprintf("%6.4b", -1)) assert_equal(" 0", sprintf("%#4b", 0)) assert_equal(" 0b1", sprintf("%#4b", 1)) @@ -44,12 +44,12 @@ assert_equal("0000", sprintf("%#.4b", 0)) assert_equal("0b0001", sprintf("%#.4b", 1)) assert_equal("0b0010", sprintf("%#.4b", 2)) - assert_equal("0b..11", sprintf("%#.4b", -1)) + assert_equal("0b1111", sprintf("%#.4b", -1)) assert_equal(" 0000", sprintf("%#6.4b", 0)) assert_equal("0b0001", sprintf("%#6.4b", 1)) assert_equal("0b0010", sprintf("%#6.4b", 2)) - assert_equal("0b..11", sprintf("%#6.4b", -1)) + assert_equal("0b1111", sprintf("%#6.4b", -1)) assert_equal("+0", sprintf("%+b", 0)) assert_equal("+1", sprintf("%+b", 1)) @@ -288,6 +288,8 @@ b1 = (/\.\./ =~ s1) != nil b2 = (/\.\./ =~ s2) != nil assert(b1 == b2, "[ruby-dev:33224]") + + assert_equal("ffffffff", sprintf("%.8x", -1)) end def test_named Index: test/ruby/test_sprintf_comb.rb =================================================================== --- test/ruby/test_sprintf_comb.rb (revision 29501) +++ test/ruby/test_sprintf_comb.rb (revision 29502) @@ -190,7 +190,7 @@ if digits.last != radix-1 digits << (radix-1) end - sign = '..' + sign = '..' unless precision else sign = '-' end @@ -222,8 +222,8 @@ end end if type == 'o' && hs - if digits.empty? || digits.last != d - digits << d + if digits.empty? || digits.last != 0 + prefix = '0' end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/