|
|
1.1 root 1: #include "f2c.h"
2: #include "fio.h"
3: #include "fmt.h"
4: #include "fp.h"
5: #ifndef VAX
6: #include "ctype.h"
7: #endif
8:
9: #ifndef KR_headers
10: #undef abs
11: #undef min
12: #undef max
13: #include "stdlib.h"
14: #include "string.h"
15: #endif
16:
17: #ifdef KR_headers
18: wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
19: #else
20: wrt_E(ufloat *p, int w, int d, int e, ftnlen len)
21: #endif
22: {
23: char buf[FMAX+EXPMAXDIGS+4], *s, *se;
24: int d1, delta, e1, i, sign, signspace;
25: double dd;
26: #ifndef VAX
27: int e0 = e;
28: #endif
29:
30: if(e <= 0)
31: e = 2;
32: if(f__scale) {
33: if(f__scale >= d + 2 || f__scale <= -d)
34: goto nogood;
35: }
36: if(f__scale <= 0)
37: --d;
38: if (len == sizeof(real))
39: dd = p->pf;
40: else
41: dd = p->pd;
42: if (dd < 0.) {
43: signspace = sign = 1;
44: dd = -dd;
45: }
46: else {
47: sign = 0;
48: signspace = (int)f__cplus;
49: #ifndef VAX
50: if (!dd)
51: dd = 0.; /* avoid -0 */
52: #endif
53: }
54: delta = w - (2 /* for the . and the d adjustment above */
55: + 2 /* for the E+ */ + signspace + d + e);
56: if (delta < 0) {
57: nogood:
58: while(--w >= 0)
59: PUT('*');
60: return(0);
61: }
62: if (f__scale < 0)
63: d += f__scale;
64: if (d > FMAX) {
65: d1 = d - FMAX;
66: d = FMAX;
67: }
68: else
69: d1 = 0;
70: sprintf(buf,"%#.*E", d, dd);
71: #ifndef VAX
72: /* check for NaN, Infinity */
73: if (!isdigit(buf[0])) {
74: switch(buf[0]) {
75: case 'n':
76: case 'N':
77: signspace = 0; /* no sign for NaNs */
78: }
79: delta = w - strlen(buf) - signspace;
80: if (delta < 0)
81: goto nogood;
82: while(--delta >= 0)
83: PUT(' ');
84: if (signspace)
85: PUT(sign ? '-' : '+');
86: for(s = buf; *s; s++)
87: PUT(*s);
88: return 0;
89: }
90: #endif
91: se = buf + d + 3;
92: if (f__scale != 1 && dd)
93: sprintf(se, "%+.2d", atoi(se) + 1 - f__scale);
94: s = ++se;
95: if (e < 2) {
96: if (*s != '0')
97: goto nogood;
98: }
99: #ifndef VAX
100: /* accommodate 3 significant digits in exponent */
101: if (s[2]) {
102: #ifdef Pedantic
103: if (!e0 && !s[3])
104: for(s -= 2, e1 = 2; s[0] = s[1]; s++);
105:
106: /* Pedantic gives the behavior that Fortran 77 specifies, */
107: /* i.e., requires that E be specified for exponent fields */
108: /* of more than 3 digits. With Pedantic undefined, we get */
109: /* the behavior that Cray displays -- you get a bigger */
110: /* exponent field if it fits. */
111: #else
112: if (!e0) {
113: for(s -= 2, e1 = 2; s[0] = s[1]; s++)
114: #ifdef CRAY
115: delta--;
116: if ((delta += 4) < 0)
117: goto nogood
118: #endif
119: ;
120: }
121: #endif
122: else if (e0 >= 0)
123: goto shift;
124: else
125: e1 = e;
126: }
127: else
128: shift:
129: #endif
130: for(s += 2, e1 = 2; *s; ++e1, ++s)
131: if (e1 >= e)
132: goto nogood;
133: while(--delta >= 0)
134: PUT(' ');
135: if (signspace)
136: PUT(sign ? '-' : '+');
137: s = buf;
138: i = f__scale;
139: if (f__scale <= 0) {
140: PUT('.');
141: for(; i < 0; ++i)
142: PUT('0');
143: PUT(*s);
144: s += 2;
145: }
146: else if (f__scale > 1) {
147: PUT(*s);
148: s += 2;
149: while(--i > 0)
150: PUT(*s++);
151: PUT('.');
152: }
153: if (d1) {
154: se -= 2;
155: while(s < se) PUT(*s++);
156: se += 2;
157: do PUT('0'); while(--d1 > 0);
158: }
159: while(s < se)
160: PUT(*s++);
161: if (e < 2)
162: PUT(s[1]);
163: else {
164: while(++e1 <= e)
165: PUT('0');
166: while(*s)
167: PUT(*s++);
168: }
169: return 0;
170: }
171:
172: #ifdef KR_headers
173: wrt_F(p,w,d,len) ufloat *p; ftnlen len;
174: #else
175: wrt_F(ufloat *p, int w, int d, ftnlen len)
176: #endif
177: {
178: int d1, sign, n;
179: double x;
180: char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s;
181:
182: x= (len==sizeof(real)?p->pf:p->pd);
183: if (d < MAXFRACDIGS)
184: d1 = 0;
185: else {
186: d1 = d - MAXFRACDIGS;
187: d = MAXFRACDIGS;
188: }
189: if (x < 0.)
190: { x = -x; sign = 1; }
191: else {
192: sign = 0;
193: #ifndef VAX
194: if (!x)
195: x = 0.;
196: #endif
197: }
198:
199: if (n = f__scale)
200: if (n > 0)
201: do x *= 10.; while(--n > 0);
202: else
203: do x *= 0.1; while(++n < 0);
204:
205: #ifdef USE_STRLEN
206: sprintf(b = buf, "%#.*f", d, x);
207: n = strlen(b) + d1;
208: #else
209: n = sprintf(b = buf, "%#.*f", d, x) + d1;
210: #endif
211:
212: if (buf[0] == '0' && d)
213: { ++b; --n; }
214: if (sign) {
215: /* check for all zeros */
216: for(s = b;;) {
217: while(*s == '0') s++;
218: switch(*s) {
219: case '.':
220: s++; continue;
221: case 0:
222: sign = 0;
223: }
224: break;
225: }
226: }
227: if (sign || f__cplus)
228: ++n;
229: if (n > w) {
230: while(--w >= 0)
231: PUT('*');
232: return 0;
233: }
234: for(w -= n; --w >= 0; )
235: PUT(' ');
236: if (sign)
237: PUT('-');
238: else if (f__cplus)
239: PUT('+');
240: while(n = *b++)
241: PUT(n);
242: while(--d1 >= 0)
243: PUT('0');
244: return 0;
245: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.