Hi Eric, > Like so. Bruno, okay to apply?
Thanks for the analysis. The patch is nearly perfect. Only the change of the 'precision' variable from 6 to 0 comes a bit too late: by this time, its value 6 has already been used for computing the size of a memory allocation. (I.e. it would allocates more memory than necessary.) I prefer this, and have committed this. (Btw, yes, gmane applied line breaking to your patch.) 2008-09-22 Eric Blake <[EMAIL PROTECTED]> Bruno Haible <[EMAIL PROTECTED]> vasnprintf: fix x86/glibc regression on printf("%La", 0.0L) * lib/vasnprintf.c (VASNPRINTF): Support 0.0 on platforms that supply %A but mishandle pseudo-NaN. Reported by Simon Josefsson. *** lib/vasnprintf.c.orig 2008-09-23 01:51:55.000000000 +0200 --- lib/vasnprintf.c 2008-09-23 01:46:21.000000000 +0200 *************** *** 2663,2671 **** /* POSIX specifies the default precision to be 6 for %f, %F, %e, %E, but not for %g, %G. Implementations appear to use ! the same default precision also for %g, %G. */ if (!has_precision) ! precision = 6; /* Allocate a temporary buffer of sufficient size. */ # if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE --- 2663,2673 ---- /* POSIX specifies the default precision to be 6 for %f, %F, %e, %E, but not for %g, %G. Implementations appear to use ! the same default precision also for %g, %G. But for %a, %A, ! the default precision is 0. */ if (!has_precision) ! if (!(dp->conversion == 'a' || dp->conversion == 'A')) ! precision = 6; /* Allocate a temporary buffer of sufficient size. */ # if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE *************** *** 3182,3187 **** --- 3184,3205 ---- *p++ = '0'; } } + else if (dp->conversion == 'a' || dp->conversion == 'A') + { + *p++ = '0'; + *p++ = dp->conversion - 'A' + 'X'; + pad_ptr = p; + *p++ = '0'; + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + for (; precision > 0; precision--) + *p++ = '0'; + } + *p++ = dp->conversion - 'A' + 'P'; + *p++ = '+'; + *p++ = '0'; + } else abort (); # endif