changeset 8254:bbea39ab5a58

Fix estimate of size needed for a 'a' or 'A' conversion.
author Bruno Haible <bruno@clisp.org>
date Sun, 25 Feb 2007 21:17:11 +0000
parents c59696ff6dbc
children 77e7d77d96c7
files ChangeLog lib/vasnprintf.c
diffstat 2 files changed, 26 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-02-25  Bruno Haible  <bruno@clisp.org>
+
+	* lib/vasnprintf.c (VASNPRINTF): Fix estimate of size needed for a
+	'a' or 'A' conversion.
+
 2007-02-25  Bruno Haible  <bruno@clisp.org>
 
 	* modules/filename: Renamed from modules/pathname.
--- a/lib/vasnprintf.c
+++ b/lib/vasnprintf.c
@@ -430,12 +430,32 @@
 		      break;
 
 		    case 'e': case 'E': case 'g': case 'G':
-		    case 'a': case 'A':
 		      tmp_length =
 			12; /* sign, decimal point, exponent etc. */
 		      tmp_length = xsum (tmp_length, precision);
 		      break;
 
+		    case 'a': case 'A':
+# if HAVE_LONG_DOUBLE
+		      if (type == TYPE_LONGDOUBLE)
+			tmp_length =
+			  (unsigned int) (LDBL_DIG
+					  * 0.831 /* decimal -> hexadecimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+# endif
+			tmp_length =
+			  (unsigned int) (DBL_DIG
+					  * 0.831 /* decimal -> hexadecimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      if (tmp_length < precision)
+			tmp_length = precision;
+		      /* Account for sign, decimal point etc. */
+		      tmp_length = xsum (tmp_length, 12);
+		      break;
+
 		    case 'c':
 # if HAVE_WINT_T && !WIDE_CHAR_VERSION
 		      if (type == TYPE_WIDE_CHAR)