# HG changeset patch # User Bruno Haible # Date 1172438231 0 # Node ID bbea39ab5a58e11edc93186b3339b4af6e21e1ea # Parent c59696ff6dbca9f7e3e20fd3d05e3919845078ef Fix estimate of size needed for a 'a' or 'A' conversion. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-02-25 Bruno Haible + + * lib/vasnprintf.c (VASNPRINTF): Fix estimate of size needed for a + 'a' or 'A' conversion. + 2007-02-25 Bruno Haible * modules/filename: Renamed from modules/pathname. diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c --- 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)