From da55cfdf724beccb3fcfddf0ce318f9fb1b36c85 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 18 Oct 2010 18:08:58 +0000 Subject: * vsnprintf.c (BSD_vfprintf): use HEXPREFIX flag for prefix of %a. [ruby-core:32841] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29531 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ test/ruby/test_sprintf.rb | 8 ++++++++ version.h | 4 ++-- vsnprintf.c | 12 ++++++------ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d943c22b5..ab2cb05780 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Oct 19 03:08:52 2010 Nobuyoshi Nakada + + * vsnprintf.c (BSD_vfprintf): use HEXPREFIX flag for prefix of %a. + [ruby-core:32841] + Mon Oct 18 13:18:01 2010 Akinori MUSHA * ext/digest/digest.c (rb_digest_class_init): Define diff --git a/test/ruby/test_sprintf.rb b/test/ruby/test_sprintf.rb index e5d07771fa..3de1cbc1b5 100644 --- a/test/ruby/test_sprintf.rb +++ b/test/ruby/test_sprintf.rb @@ -211,6 +211,14 @@ class TestSprintf < Test::Unit::TestCase assert_equal(" -0x1.2p+0", sprintf("%10a", -1.125)) assert_equal(" -0x1.1p+0", sprintf("%10a", -1.0625)) assert_equal("-0x1.08p+0", sprintf("%10a", -1.03125)) + + bug3962 = '[ruby-core:32841]' + assert_equal("-0x0001p+0", sprintf("%010a", -1), bug3962) + assert_equal("-0x01.8p+0", sprintf("%010a", -1.5), bug3962) + assert_equal("-0x01.4p+0", sprintf("%010a", -1.25), bug3962) + assert_equal("-0x01.2p+0", sprintf("%010a", -1.125), bug3962) + assert_equal("-0x01.1p+0", sprintf("%010a", -1.0625), bug3962) + assert_equal("-0x1.08p+0", sprintf("%010a", -1.03125), bug3962) end BSIZ = 120 diff --git a/version.h b/version.h index aef0bf4ef2..0f9e786727 100644 --- a/version.h +++ b/version.h @@ -1,11 +1,11 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_RELEASE_DATE "2010-10-18" +#define RUBY_RELEASE_DATE "2010-10-19" #define RUBY_PATCHLEVEL -1 #define RUBY_BRANCH_NAME "trunk" #define RUBY_RELEASE_YEAR 2010 #define RUBY_RELEASE_MONTH 10 -#define RUBY_RELEASE_DAY 18 +#define RUBY_RELEASE_DAY 19 #include "ruby/version.h" diff --git a/vsnprintf.c b/vsnprintf.c index 1f53bc4265..9c15a4b7b6 100644 --- a/vsnprintf.c +++ b/vsnprintf.c @@ -826,8 +826,10 @@ fp_begin: _double = va_arg(ap, double); ch = 'g'; } if (ch == 'a' || ch == 'A') { + flags |= HEXPREFIX; --expt; expsize = exponent(expstr, expt, ch + 'p' - 'a'); + ch += 'x' - 'a'; size = expsize + ndig; size += 2; /* 0x */ if (ndig > 1) @@ -1037,7 +1039,8 @@ long_len: /* prefix */ if (sign) { PRINT(&sign, 1); - } else if (flags & HEXPREFIX) { + } + if (flags & HEXPREFIX) { ox[0] = '0'; ox[1] = ch; PRINT(ox, 2); @@ -1051,7 +1054,7 @@ long_len: PAD_L(dprec - fieldsz, zeroes); if (sign) fieldsz--; - else if (flags & HEXPREFIX) + if (flags & HEXPREFIX) fieldsz -= 2; /* the string or number proper */ @@ -1059,10 +1062,7 @@ long_len: if ((flags & FPT) == 0) { PRINT(cp, fieldsz); } else { /* glue together f_p fragments */ - if (ch == 'a' || ch == 'A') { - ox[0] = '0'; - ox[1] = ch + ('x' - 'a'); - PRINT(ox, 2); + if (flags & HEXPREFIX) { if (ndig > 1 || flags & ALT) { ox[2] = *cp++; ox[3] = '.'; -- cgit v1.2.3