diff options
-rw-r--r-- | src/lib/libc/stdlib/gcvt.c | 18 |
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 | } |