summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormillert <>2006-01-10 02:08:28 +0000
committermillert <>2006-01-10 02:08:28 +0000
commitf04f970dc1c3a580d4e8264cea6e3ec0159cba66 (patch)
tree0c0f09a84f9865afee312fbb8eb97d9d6eb3fe6b /src
parenta1dabd50a20b20400ed3cb962396f97efdd353a3 (diff)
downloadopenbsd-f04f970dc1c3a580d4e8264cea6e3ec0159cba66.tar.gz
openbsd-f04f970dc1c3a580d4e8264cea6e3ec0159cba66.tar.bz2
openbsd-f04f970dc1c3a580d4e8264cea6e3ec0159cba66.zip
Nan and Infinity can be negative
Decimal point was missing for some exponential output Only divide sign by 10 once per loop Add a missing NUL terminator for one case If there is no whole number portion, print a leading zero (e.g. 0.1 not .1)
Diffstat (limited to 'src')
-rw-r--r--src/lib/libc/stdlib/gcvt.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/lib/libc/stdlib/gcvt.c b/src/lib/libc/stdlib/gcvt.c
index 849af60304..87bd843307 100644
--- a/src/lib/libc/stdlib/gcvt.c
+++ b/src/lib/libc/stdlib/gcvt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: gcvt.c,v 1.6 2005/08/08 08:05:36 espie Exp $ */ 1/* $OpenBSD: gcvt.c,v 1.7 2006/01/10 02:08:28 millert Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2002, 2003 Todd C. Miller <Todd.Miller@courtesan.com> 4 * Copyright (c) 2002, 2003 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -40,7 +40,7 @@ gcvt(double value, int ndigit, char *buf)
40 digits = __dtoa(value, 2, ndigit, &decpt, &sign, NULL); 40 digits = __dtoa(value, 2, ndigit, &decpt, &sign, NULL);
41 if (decpt == 9999) { 41 if (decpt == 9999) {
42 /* Infinity or NaN, assume buffer is at least ndigit long. */ 42 /* Infinity or NaN, assume buffer is at least ndigit long. */
43 strlcpy(buf, digits, ndigit + 1); 43 snprintf(buf, ndigit + 1, "%s%s", sign ? "-" : "", digits);
44 return (buf); 44 return (buf);
45 } 45 }
46 46
@@ -49,13 +49,16 @@ gcvt(double value, int ndigit, char *buf)
49 *dst++ = '-'; 49 *dst++ = '-';
50 50
51 if (decpt < 0 || decpt > ndigit) { 51 if (decpt < 0 || decpt > ndigit) {
52 /* exponential format */ 52 /* exponential format (e.g. 1.2345e+13) */
53 if (--decpt < 0) { 53 if (--decpt < 0) {
54 sign = 1; 54 sign = 1;
55 decpt = -decpt; 55 decpt = -decpt;
56 } else 56 } else
57 sign = 0; 57 sign = 0;
58 for (src = digits; *src != '\0'; ) 58 src = digits;
59 *dst++ = *src++;
60 *dst++ = '.'; /* XXX - locale-specific */
61 while (*src != '\0')
59 *dst++ = *src++; 62 *dst++ = *src++;
60 *dst++ = 'e'; 63 *dst++ = 'e';
61 if (sign) 64 if (sign)
@@ -69,7 +72,8 @@ gcvt(double value, int ndigit, char *buf)
69 } else { 72 } else {
70 /* XXX - optimize */ 73 /* XXX - optimize */
71 for (sign = decpt, i = 0; (sign /= 10) != 0; i++) 74 for (sign = decpt, i = 0; (sign /= 10) != 0; i++)
72 sign /= 10; 75 continue;
76 dst[i + 1] = '\0';
73 while (decpt != 0) { 77 while (decpt != 0) {
74 dst[i--] = '0' + decpt % 10; 78 dst[i--] = '0' + decpt % 10;
75 decpt /= 10; 79 decpt /= 10;
@@ -84,7 +88,9 @@ gcvt(double value, int ndigit, char *buf)
84 *dst++ = '0'; 88 *dst++ = '0';
85 } 89 }
86 if (*src != '\0') { 90 if (*src != '\0') {
87 *dst++ = '.'; /* XXX - locale-specific (LC_NUMERIC) */ 91 if (src == digits)
92 *dst++ = '0'; /* zero before decimal point */
93 *dst++ = '.'; /* XXX - locale-specific */
88 for (i = decpt; digits[i] != '\0'; i++) { 94 for (i = decpt; digits[i] != '\0'; i++) {
89 *dst++ = digits[i]; 95 *dst++ = digits[i];
90 } 96 }