|
|
1.1 root 1: /****************************************************************
2: Copyright 1990 by AT&T Bell Laboratories and Bellcore.
3:
4: Permission to use, copy, modify, and distribute this software
5: and its documentation for any purpose and without fee is hereby
6: granted, provided that the above copyright notice appear in all
7: copies and that both that the copyright notice and this
8: permission notice and warranty disclaimer appear in supporting
9: documentation, and that the names of AT&T Bell Laboratories or
10: Bellcore or any of their entities not be used in advertising or
11: publicity pertaining to distribution of the software without
12: specific, written prior permission.
13:
14: AT&T and Bellcore disclaim all warranties with regard to this
15: software, including all implied warranties of merchantability
16: and fitness. In no event shall AT&T or Bellcore be liable for
17: any special, indirect or consequential damages or any damages
18: whatsoever resulting from loss of use, data or profits, whether
19: in an action of contract, negligence or other tortious action,
20: arising out of or in connection with the use or performance of
21: this software.
22: ****************************************************************/
23:
24: /* Put strings representing decimal floating-point numbers
25: * into canonical form: always have a decimal point or
26: * exponent field; if using an exponent field, have the
27: * number before it start with a digit and decimal point
28: * (if the number has more than one digit); only have an
29: * exponent field if it saves space.
30: *
31: * Arrange that the return value, rv, satisfies rv[0] == '-' || rv[-1] == '-' .
32: */
33:
34: #include "sysdep.h"
35:
36: char *
37: cds(s, z0)
38: char *s, *z0;
39: {
40: int ea, esign, et, i, k, nd = 0, sign = 0, tz;
41: char c, *z;
42: char ebuf[24];
43: long ex = 0;
44: static char etype[Table_size], *db;
45: static int dblen = 64;
46:
47: if (!db) {
48: etype['E'] = 1;
49: etype['e'] = 1;
50: etype['D'] = 1;
51: etype['d'] = 1;
52: etype['+'] = 2;
53: etype['-'] = 3;
54: db = Alloc(dblen);
55: }
56:
57: while((c = *s++) == '0');
58: if (c == '-')
59: { sign = 1; c = *s++; }
60: else if (c == '+')
61: c = *s++;
62: k = strlen(s) + 2;
63: if (k >= dblen) {
64: do dblen <<= 1;
65: while(k >= dblen);
66: free(db);
67: db = Alloc(dblen);
68: }
69: if (etype[(unsigned char)c] >= 2)
70: while(c == '0') c = *s++;
71: tz = 0;
72: while(c >= '0' && c <= '9') {
73: if (c == '0')
74: tz++;
75: else {
76: if (nd)
77: for(; tz; --tz)
78: db[nd++] = '0';
79: else
80: tz = 0;
81: db[nd++] = c;
82: }
83: c = *s++;
84: }
85: ea = -tz;
86: if (c == '.') {
87: while((c = *s++) >= '0' && c <= '9') {
88: if (c == '0')
89: tz++;
90: else {
91: if (tz) {
92: ea += tz;
93: if (nd)
94: for(; tz; --tz)
95: db[nd++] = '0';
96: else
97: tz = 0;
98: }
99: db[nd++] = c;
100: ea++;
101: }
102: }
103: }
104: if (et = etype[(unsigned char)c]) {
105: esign = et == 3;
106: c = *s++;
107: if (et == 1) {
108: if(etype[(unsigned char)c] > 1) {
109: if (c == '-')
110: esign = 1;
111: c = *s++;
112: }
113: }
114: while(c >= '0' && c <= '9') {
115: ex = 10*ex + (c - '0');
116: c = *s++;
117: }
118: if (esign)
119: ex = -ex;
120: }
121: /* debug */ if (c)
122: /* debug*/ Fatal("unexpected character in cds");
123: ex -= ea;
124: if (!nd) {
125: if (!z0)
126: z0 = mem(4,0);
127: strcpy(z0, "-0.");
128: sign = 0;
129: }
130: else if (ex > 2 || ex + nd < -2) {
131: sprintf(ebuf, "%ld", ex + nd - 1);
132: k = strlen(ebuf) + nd + 3;
133: if (nd > 1)
134: k++;
135: if (!z0)
136: z0 = mem(k,0);
137: z = z0;
138: *z++ = '-';
139: *z++ = *db;
140: if (nd > 1) {
141: *z++ = '.';
142: for(k = 1; k < nd; k++)
143: *z++ = db[k];
144: }
145: *z++ = 'e';
146: strcpy(z, ebuf);
147: }
148: else {
149: k = (int)(ex + nd);
150: i = nd + 3;
151: if (k < 0)
152: i -= k;
153: else if (ex > 0)
154: i += ex;
155: if (!z0)
156: z0 = mem(i,0);
157: z = z0;
158: *z++ = '-';
159: if (ex >= 0) {
160: for(k = 0; k < nd; k++)
161: *z++ = db[k];
162: while(--ex >= 0)
163: *z++ = '0';
164: *z++ = '.';
165: }
166: else {
167: for(i = 0; i < k;)
168: *z++ = db[i++];
169: *z++ = '.';
170: while(++k <= 0)
171: *z++ = '0';
172: while(i < nd)
173: *z++ = db[i++];
174: }
175: *z = 0;
176: }
177: return sign ? z0 : z0+1;
178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.