# HG changeset patch # User Eric Blake # Date 1222127662 -7200 # Node ID 3e1c3b04eec2593cdf47c165c5168c4a9342a66d # Parent 203312d94de66ba4d36b5012d6a1025dee12d13b vasnprintf: fix x86/glibc regression on printf("%La", 0.0L) diff -r 203312d94de6 -r 3e1c3b04eec2 ChangeLog --- a/ChangeLog Mon Sep 22 01:13:00 2008 +0200 +++ b/ChangeLog Tue Sep 23 01:54:22 2008 +0200 @@ -1,3 +1,11 @@ +2008-09-22 Eric Blake + Bruno Haible + + 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. + 2008-09-21 Bruno Haible * tests/test-lock.c (main): Tweak skip message. diff -r 203312d94de6 -r 3e1c3b04eec2 lib/vasnprintf.c --- a/lib/vasnprintf.c Mon Sep 22 01:13:00 2008 +0200 +++ b/lib/vasnprintf.c Tue Sep 23 01:54:22 2008 +0200 @@ -2663,9 +2663,11 @@ /* 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. */ + the same default precision also for %g, %G. But for %a, %A, + the default precision is 0. */ if (!has_precision) - precision = 6; + 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,6 +3184,22 @@ *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