1 *37da2899SCharles.Forsyth /****************************************************************
2 *37da2899SCharles.Forsyth *
3 *37da2899SCharles.Forsyth * The author of this software is David M. Gay.
4 *37da2899SCharles.Forsyth *
5 *37da2899SCharles.Forsyth * Copyright (c) 1991, 1996 by Lucent Technologies.
6 *37da2899SCharles.Forsyth *
7 *37da2899SCharles.Forsyth * Permission to use, copy, modify, and distribute this software for any
8 *37da2899SCharles.Forsyth * purpose without fee is hereby granted, provided that this entire notice
9 *37da2899SCharles.Forsyth * is included in all copies of any software which is or includes a copy
10 *37da2899SCharles.Forsyth * or modification of this software and in all copies of the supporting
11 *37da2899SCharles.Forsyth * documentation for such software.
12 *37da2899SCharles.Forsyth *
13 *37da2899SCharles.Forsyth * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
14 *37da2899SCharles.Forsyth * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
15 *37da2899SCharles.Forsyth * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16 *37da2899SCharles.Forsyth * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
17 *37da2899SCharles.Forsyth *
18 *37da2899SCharles.Forsyth ***************************************************************/
19 *37da2899SCharles.Forsyth
20 *37da2899SCharles.Forsyth /* g_fmt(buf,x) stores the closest decimal approximation to x in buf;
21 *37da2899SCharles.Forsyth * it suffices to declare buf
22 *37da2899SCharles.Forsyth * char buf[32];
23 *37da2899SCharles.Forsyth */
24 *37da2899SCharles.Forsyth
25 *37da2899SCharles.Forsyth #ifdef __cplusplus
26 *37da2899SCharles.Forsyth extern "C" {
27 *37da2899SCharles.Forsyth #endif
28 *37da2899SCharles.Forsyth extern char *dtoa(double, int, int, int *, int *, char **);
29 *37da2899SCharles.Forsyth extern char *g_fmt(char *, double, int);
30 *37da2899SCharles.Forsyth extern void freedtoa(char*);
31 *37da2899SCharles.Forsyth #ifdef __cplusplus
32 *37da2899SCharles.Forsyth }
33 *37da2899SCharles.Forsyth #endif
34 *37da2899SCharles.Forsyth
35 *37da2899SCharles.Forsyth char *
g_fmt(register char * b,double x,int echr)36 *37da2899SCharles.Forsyth g_fmt(register char *b, double x, int echr)
37 *37da2899SCharles.Forsyth {
38 *37da2899SCharles.Forsyth register int i, k;
39 *37da2899SCharles.Forsyth register char *s;
40 *37da2899SCharles.Forsyth int decpt, j, sign;
41 *37da2899SCharles.Forsyth char *b0, *s0, *se;
42 *37da2899SCharles.Forsyth
43 *37da2899SCharles.Forsyth b0 = b;
44 *37da2899SCharles.Forsyth #ifdef IGNORE_ZERO_SIGN
45 *37da2899SCharles.Forsyth if (!x) {
46 *37da2899SCharles.Forsyth *b++ = '0';
47 *37da2899SCharles.Forsyth *b = 0;
48 *37da2899SCharles.Forsyth goto done;
49 *37da2899SCharles.Forsyth }
50 *37da2899SCharles.Forsyth #endif
51 *37da2899SCharles.Forsyth s = s0 = dtoa(x, 0, 0, &decpt, &sign, &se);
52 *37da2899SCharles.Forsyth if (sign)
53 *37da2899SCharles.Forsyth *b++ = '-';
54 *37da2899SCharles.Forsyth if (decpt == 9999) /* Infinity or Nan */ {
55 *37da2899SCharles.Forsyth while(*b++ = *s++);
56 *37da2899SCharles.Forsyth goto done0;
57 *37da2899SCharles.Forsyth }
58 *37da2899SCharles.Forsyth if (decpt <= -4 || decpt > se - s + 5) {
59 *37da2899SCharles.Forsyth *b++ = *s++;
60 *37da2899SCharles.Forsyth if (*s) {
61 *37da2899SCharles.Forsyth *b++ = '.';
62 *37da2899SCharles.Forsyth while(*b = *s++)
63 *37da2899SCharles.Forsyth b++;
64 *37da2899SCharles.Forsyth }
65 *37da2899SCharles.Forsyth *b++ = echr;
66 *37da2899SCharles.Forsyth /* sprintf(b, "%+.2d", decpt - 1); */
67 *37da2899SCharles.Forsyth if (--decpt < 0) {
68 *37da2899SCharles.Forsyth *b++ = '-';
69 *37da2899SCharles.Forsyth decpt = -decpt;
70 *37da2899SCharles.Forsyth }
71 *37da2899SCharles.Forsyth else
72 *37da2899SCharles.Forsyth *b++ = '+';
73 *37da2899SCharles.Forsyth for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10);
74 *37da2899SCharles.Forsyth for(;;) {
75 *37da2899SCharles.Forsyth i = decpt / k;
76 *37da2899SCharles.Forsyth *b++ = i + '0';
77 *37da2899SCharles.Forsyth if (--j <= 0)
78 *37da2899SCharles.Forsyth break;
79 *37da2899SCharles.Forsyth decpt -= i*k;
80 *37da2899SCharles.Forsyth decpt *= 10;
81 *37da2899SCharles.Forsyth }
82 *37da2899SCharles.Forsyth *b = 0;
83 *37da2899SCharles.Forsyth }
84 *37da2899SCharles.Forsyth else if (decpt <= 0) {
85 *37da2899SCharles.Forsyth *b++ = '.';
86 *37da2899SCharles.Forsyth for(; decpt < 0; decpt++)
87 *37da2899SCharles.Forsyth *b++ = '0';
88 *37da2899SCharles.Forsyth while(*b++ = *s++);
89 *37da2899SCharles.Forsyth }
90 *37da2899SCharles.Forsyth else {
91 *37da2899SCharles.Forsyth while(*b = *s++) {
92 *37da2899SCharles.Forsyth b++;
93 *37da2899SCharles.Forsyth if (--decpt == 0 && *s)
94 *37da2899SCharles.Forsyth *b++ = '.';
95 *37da2899SCharles.Forsyth }
96 *37da2899SCharles.Forsyth for(; decpt > 0; decpt--)
97 *37da2899SCharles.Forsyth *b++ = '0';
98 *37da2899SCharles.Forsyth *b = 0;
99 *37da2899SCharles.Forsyth }
100 *37da2899SCharles.Forsyth done0:
101 *37da2899SCharles.Forsyth freedtoa(s0);
102 *37da2899SCharles.Forsyth #ifdef IGNORE_ZERO_SIGN
103 *37da2899SCharles.Forsyth done:
104 *37da2899SCharles.Forsyth #endif
105 *37da2899SCharles.Forsyth return b0;
106 *37da2899SCharles.Forsyth }
107