From 81ae2e9a4d89ba3af7cc008df88497518f3777fc Mon Sep 17 00:00:00 2001 From: David Schultz Date: Mon, 14 Apr 2003 11:24:53 +0000 Subject: [PATCH] Fix a bug where printf was erroneously printing a decimal point for %f and sufficiently short %g specifiers where the precision was explicitly zero, no '#' flag was specified, and the floating point argument was > 0 and <= 0.5. While at it, add some comments to better explain the relevant bits of code. Noticed by: Christoph Kukulies --- lib/libc/stdio/vfprintf.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/libc/stdio/vfprintf.c b/lib/libc/stdio/vfprintf.c index 8ca5ac424a12..0f0cf5291f35 100644 --- a/lib/libc/stdio/vfprintf.c +++ b/lib/libc/stdio/vfprintf.c @@ -928,12 +928,14 @@ reswitch: switch (ch) { if (prec > 1 || flags & ALT) ++size; } else { - if (expt > 0) { + /* space for digits before decimal point */ + if (expt > 0) size = expt; - if (prec || flags & ALT) - size += prec + 1; - } else /* "0.X" */ - size = prec + 2; + else /* "0" */ + size = 1; + /* space for decimal pt and following digits */ + if (prec || flags & ALT) + size += prec + 1; if (grouping && expt > 0) { /* space for thousands' grouping */ nseps = nrepeats = 0; @@ -1163,9 +1165,9 @@ number: if ((dprec = prec) >= 0) } else { /* glue together f_p fragments */ if (!expchar) { /* %[fF] or sufficiently short %[gG] */ if (expt <= 0) { - buf[0] = '0'; - buf[1] = *decimal_point; - PRINT(buf, 2); + PRINT(zeroes, 1); + if (prec || flags & ALT) + PRINT(decimal_point, 1); PAD(-expt, zeroes); /* already handled initial 0's */ prec += expt;