diff options
Diffstat (limited to 'g_fmt.c')
-rw-r--r-- | g_fmt.c | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -26,14 +26,14 @@ | |||
26 | extern "C" { | 26 | extern "C" { |
27 | #endif | 27 | #endif |
28 | extern char *dtoa(double, int, int, int *, int *, char **); | 28 | extern char *dtoa(double, int, int, int *, int *, char **); |
29 | extern char *g_fmt(char *, double); | 29 | extern int g_fmt(char *, double, int); |
30 | extern void freedtoa(char*); | 30 | extern void freedtoa(char*); |
31 | #ifdef __cplusplus | 31 | #ifdef __cplusplus |
32 | } | 32 | } |
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | char * | 35 | int |
36 | g_fmt(register char *b, double x) | 36 | fpconv_g_fmt(char *b, double x, int precision) |
37 | { | 37 | { |
38 | register int i, k; | 38 | register int i, k; |
39 | register char *s; | 39 | register char *s; |
@@ -48,18 +48,21 @@ g_fmt(register char *b, double x) | |||
48 | goto done; | 48 | goto done; |
49 | } | 49 | } |
50 | #endif | 50 | #endif |
51 | s = s0 = dtoa(x, 0, 0, &decpt, &sign, &se); | 51 | s = s0 = dtoa(x, 2, precision, &decpt, &sign, &se); |
52 | if (sign) | 52 | if (sign) |
53 | *b++ = '-'; | 53 | *b++ = '-'; |
54 | if (decpt == 9999) /* Infinity or Nan */ { | 54 | if (decpt == 9999) /* Infinity or Nan */ { |
55 | while(*b++ = *s++); | 55 | while((*b++ = *s++)); |
56 | /* "b" is used to calculate the return length. Decrement to exclude the | ||
57 | * Null terminator from the length */ | ||
58 | b--; | ||
56 | goto done0; | 59 | goto done0; |
57 | } | 60 | } |
58 | if (decpt <= -4 || decpt > se - s + 5) { | 61 | if (decpt <= -4 || decpt > precision) { |
59 | *b++ = *s++; | 62 | *b++ = *s++; |
60 | if (*s) { | 63 | if (*s) { |
61 | *b++ = '.'; | 64 | *b++ = '.'; |
62 | while(*b = *s++) | 65 | while((*b = *s++)) |
63 | b++; | 66 | b++; |
64 | } | 67 | } |
65 | *b++ = 'e'; | 68 | *b++ = 'e'; |
@@ -82,13 +85,14 @@ g_fmt(register char *b, double x) | |||
82 | *b = 0; | 85 | *b = 0; |
83 | } | 86 | } |
84 | else if (decpt <= 0) { | 87 | else if (decpt <= 0) { |
88 | *b++ = '0'; | ||
85 | *b++ = '.'; | 89 | *b++ = '.'; |
86 | for(; decpt < 0; decpt++) | 90 | for(; decpt < 0; decpt++) |
87 | *b++ = '0'; | 91 | *b++ = '0'; |
88 | while(*b++ = *s++); | 92 | while((*b++ = *s++)); |
89 | } | 93 | } |
90 | else { | 94 | else { |
91 | while(*b = *s++) { | 95 | while((*b = *s++)) { |
92 | b++; | 96 | b++; |
93 | if (--decpt == 0 && *s) | 97 | if (--decpt == 0 && *s) |
94 | *b++ = '.'; | 98 | *b++ = '.'; |
@@ -99,6 +103,8 @@ g_fmt(register char *b, double x) | |||
99 | } | 103 | } |
100 | done0: | 104 | done0: |
101 | freedtoa(s0); | 105 | freedtoa(s0); |
106 | #ifdef IGNORE_ZERO_SIGN | ||
102 | done: | 107 | done: |
103 | return b0; | 108 | #endif |
109 | return b - b0; | ||
104 | } | 110 | } |