aboutsummaryrefslogtreecommitdiff
path: root/g_fmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'g_fmt.c')
-rw-r--r--g_fmt.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/g_fmt.c b/g_fmt.c
index 543430a..130dcd4 100644
--- a/g_fmt.c
+++ b/g_fmt.c
@@ -26,14 +26,14 @@
26extern "C" { 26extern "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 * 35int
36g_fmt(register char *b, double x) 36fpconv_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 }