-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
C99 basically requires the intuitive relation that if printf can generate
something using a single % specifier, scanf can restore the same value
(well, with the caveat that scanf can use a canonical NaN instead of
supporting all 2^53 of them, and within the limits of rounding if the
printf precision was too small). Or, more directly,
"C99+TC1+TC2: 7.19.6.1 The fprintf function
Paragraph 6, discussion on the '0' flag: ... leading zeros ...
are used to pad to the field width rather than performing space
padding, except when converting an infinity or NaN."
http://www.opengroup.org/austin/mailarchives/ag/msg10445.html
So printf("%05f",1./0) should result in " inf", not "00inf". OK to apply?
2007-04-12 Eric Blake <ebb9@byu.net>
* libc/stdio/vfprintf.c (_VFPRINTF_F): Don't zero pad on infinity
or NaN with %05f.
- --
Don't work too hard, make some time for fun as well!
Eric Blake ebb9@byu.net
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFGHuo884KuGfSFAYARAtrHAJ43u0Y8SgDDwHdFOB467P917IxhyACeLKIJ
X7qzFt/M6GRhy9XA4WwMo9c=
=f8q4
-----END PGP SIGNATURE-----
------------------------------------------------------------------------
Index: libc/stdio/vfprintf.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/vfprintf.c,v
retrieving revision 1.49
diff -u -p -r1.49 vfprintf.c
--- libc/stdio/vfprintf.c 13 Apr 2007 01:57:33 -0000 1.49
+++ libc/stdio/vfprintf.c 13 Apr 2007 02:18:02 -0000
@@ -872,7 +872,14 @@ reswitch: switch (ch) {
_fpvalue = GET_ARG (N, ap, double);
}
- /* do this before tricky precision changes */
+ /* do this before tricky precision changes
+
+ If the output is infinite or NaN, leading
+ zeros are not permitted. Otherwise, scanf
+ could not read what print wrote.
+
+ http://www.opengroup.org/austin/mailarchives/ag/msg10445.html
+ */
if (isinf (_fpvalue)) {
if (_fpvalue < 0)
sign = '-';
@@ -881,6 +888,7 @@ reswitch: switch (ch) {
else
cp = "inf";
size = 3;
+ flags &= ~ZEROPAD;
break;
}
if (isnan (_fpvalue)) {
@@ -889,11 +897,12 @@ reswitch: switch (ch) {
else
cp = "nan";
size = 3;
+ flags &= ~ZEROPAD;
break;
}
#else /* !_NO_LONGDBL */
-
+
if (flags & LONGDBL) {
_fpvalue = GET_ARG (N, ap, _LONG_DOUBLE);
} else {
@@ -910,6 +919,7 @@ reswitch: switch (ch) {
else
cp = "inf";
size = 3;
+ flags &= ~ZEROPAD;
break;
}
if (tmp == 1) {
@@ -918,6 +928,7 @@ reswitch: switch (ch) {
else
cp = "nan";
size = 3;
+ flags &= ~ZEROPAD;
break;
}
#endif /* !_NO_LONGDBL */