summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/print.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/print.c b/src/print.c
index 3609684c640..1e83d1907e8 100644
--- a/src/print.c
+++ b/src/print.c
@@ -668,19 +668,21 @@ float_to_string (buf, data)
/* Check the width specification. */
width = -1;
if ('0' <= *cp && *cp <= '9')
- for (width = 0; (*cp >= '0' && *cp <= '9'); cp++)
- width = (width * 10) + (*cp - '0');
+ {
+ width = 0;
+ do
+ width = (width * 10) + (*cp++ - '0');
+ while (*cp >= '0' && *cp <= '9');
+
+ /* A precision of zero is valid only for %f. */
+ if (width > DBL_DIG
+ || (width == 0 && *cp != 'f'))
+ goto lose;
+ }
if (*cp != 'e' && *cp != 'f' && *cp != 'g')
goto lose;
- /* A precision of zero is valid for %f; everything else requires
- at least one. Width may be omitted anywhere. */
- if (width != -1
- && (width < (*cp != 'f')
- || width > DBL_DIG))
- goto lose;
-
if (cp[1] != 0)
goto lose;