From a7e8b12f96bcea99a855092e4b200ddfed6c8c41 Mon Sep 17 00:00:00 2001 From: naruse Date: Mon, 18 Oct 2010 00:59:31 +0000 Subject: * sprintf.c (BSD_vfprintf): wrong padding arround prefix and floating point with %a. [ruby-dev:42403] Bug #3956 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29521 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ test/ruby/test_sprintf.rb | 7 +++++++ vsnprintf.c | 3 +++ 3 files changed, 15 insertions(+) diff --git a/ChangeLog b/ChangeLog index ccb260b451..af8909e240 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Oct 18 09:57:28 2010 NARUSE, Yui + + * sprintf.c (BSD_vfprintf): wrong padding arround prefix and + floating point with %a. [ruby-dev:42403] Bug #3956 + Sun Oct 17 22:36:33 2010 Tadayoshi Funaba * lib/date/delta.rb: added an rdoc tag. diff --git a/test/ruby/test_sprintf.rb b/test/ruby/test_sprintf.rb index 96a1b62bb7..9c4566f8d0 100644 --- a/test/ruby/test_sprintf.rb +++ b/test/ruby/test_sprintf.rb @@ -204,6 +204,13 @@ class TestSprintf < Test::Unit::TestCase assert_equal("Inf", sprintf("%E", Float::INFINITY)) assert_equal("NaN", sprintf("%e", Float::NAN)) assert_equal("NaN", sprintf("%E", Float::NAN)) + + assert_equal(" -0x1p+0", sprintf("%10a", -1)) + assert_equal(" -0x1.8p+0", sprintf("%10a", -1.5)) + assert_equal(" -0x1.4p+0", sprintf("%10a", -1.25)) + assert_equal(" -0x1.2p+0", sprintf("%10a", -1.125)) + assert_equal(" -0x1.1p+0", sprintf("%10a", -1.0625)) + assert_equal("-0x1.05p+0", sprintf("%10a", -1.03125)) end BSIZ = 120 diff --git a/vsnprintf.c b/vsnprintf.c index a1ac4424a2..1f53bc4265 100644 --- a/vsnprintf.c +++ b/vsnprintf.c @@ -829,6 +829,9 @@ fp_begin: _double = va_arg(ap, double); --expt; expsize = exponent(expstr, expt, ch + 'p' - 'a'); size = expsize + ndig; + size += 2; /* 0x */ + if (ndig > 1) + ++size; /* floating point */ } else if (ch <= 'e') { /* 'e' or 'E' fmt */ --expt; -- cgit v1.2.3