source: vendor/gcc/3.3.4/libf2c/libI77/wref.c

Last change on this file was 1391, checked in by bird, 21 years ago

GCC v3.3.3 sources.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.8 KB
Line 
1#include "f2c.h"
2#include "fio.h"
3#ifndef VAX
4#include <ctype.h>
5#endif
6
7#undef abs
8#undef min
9#undef max
10#include <stdlib.h>
11#include <string.h>
12
13#include "fmt.h"
14#include "fp.h"
15
16int
17wrt_E (ufloat * p, int w, int d, int e, ftnlen len)
18{
19 char buf[FMAX + EXPMAXDIGS + 4], *s, *se;
20 int d1, delta, e1, i, sign, signspace;
21 double dd;
22#ifdef WANT_LEAD_0
23 int insert0 = 0;
24#endif
25#ifndef VAX
26 int e0 = e;
27#endif
28
29 if (e <= 0)
30 e = 2;
31 if (f__scale)
32 {
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 {
44 signspace = sign = 1;
45 dd = -dd;
46 }
47 else
48 {
49 sign = 0;
50 signspace = (int) f__cplus;
51#ifndef VAX
52 if (!dd)
53 dd = 0.; /* avoid -0 */
54#endif
55 }
56 delta = w - (2 /* for the . and the d adjustment above */
57 + 2 /* for the E+ */ + signspace + d + e);
58#ifdef WANT_LEAD_0
59 if (f__scale <= 0 && delta > 0)
60 {
61 delta--;
62 insert0 = 1;
63 }
64 else
65#endif
66 if (delta < 0)
67 {
68 nogood:
69 while (--w >= 0)
70 PUT ('*');
71 return (0);
72 }
73 if (f__scale < 0)
74 d += f__scale;
75 if (d > FMAX)
76 {
77 d1 = d - FMAX;
78 d = FMAX;
79 }
80 else
81 d1 = 0;
82 sprintf (buf, "%#.*E", d, dd);
83#ifndef VAX
84 /* check for NaN, Infinity */
85 if (!isdigit ((unsigned char) buf[0]))
86 {
87 switch (buf[0])
88 {
89 case 'n':
90 case 'N':
91 signspace = 0; /* no sign for NaNs */
92 }
93 delta = w - strlen (buf) - signspace;
94 if (delta < 0)
95 goto nogood;
96 while (--delta >= 0)
97 PUT (' ');
98 if (signspace)
99 PUT (sign ? '-' : '+');
100 for (s = buf; *s; s++)
101 PUT (*s);
102 return 0;
103 }
104#endif
105 se = buf + d + 3;
106#ifdef GOOD_SPRINTF_EXPONENT /* When possible, exponent has 2 digits. */
107 if (f__scale != 1 && dd)
108 sprintf (se, "%+.2d", atoi (se) + 1 - f__scale);
109#else
110 if (dd)
111 sprintf (se, "%+.2d", atoi (se) + 1 - f__scale);
112 else
113 strcpy (se, "+00");
114#endif
115 s = ++se;
116 if (e < 2)
117 {
118 if (*s != '0')
119 goto nogood;
120 }
121#ifndef VAX
122 /* accommodate 3 significant digits in exponent */
123 if (s[2])
124 {
125#ifdef Pedantic
126 if (!e0 && !s[3])
127 for (s -= 2, e1 = 2; s[0] = s[1]; s++);
128
129 /* Pedantic gives the behavior that Fortran 77 specifies, */
130 /* i.e., requires that E be specified for exponent fields */
131 /* of more than 3 digits. With Pedantic undefined, we get */
132 /* the behavior that Cray displays -- you get a bigger */
133 /* exponent field if it fits. */
134#else
135 if (!e0)
136 {
137 for (s -= 2, e1 = 2; (s[0] = s[1]); s++)
138#ifdef CRAY
139 delta--;
140 if ((delta += 4) < 0)
141 goto nogood
142#endif
143 ;
144 }
145#endif
146 else if (e0 >= 0)
147 goto shift;
148 else
149 e1 = e;
150 }
151 else
152 shift:
153#endif
154 for (s += 2, e1 = 2; *s; ++e1, ++s)
155 if (e1 >= e)
156 goto nogood;
157 while (--delta >= 0)
158 PUT (' ');
159 if (signspace)
160 PUT (sign ? '-' : '+');
161 s = buf;
162 i = f__scale;
163 if (f__scale <= 0)
164 {
165#ifdef WANT_LEAD_0
166 if (insert0)
167 PUT ('0');
168#endif
169 PUT ('.');
170 for (; i < 0; ++i)
171 PUT ('0');
172 PUT (*s);
173 s += 2;
174 }
175 else if (f__scale > 1)
176 {
177 PUT (*s);
178 s += 2;
179 while (--i > 0)
180 PUT (*s++);
181 PUT ('.');
182 }
183 if (d1)
184 {
185 se -= 2;
186 while (s < se)
187 PUT (*s++);
188 se += 2;
189 do
190 PUT ('0');
191 while (--d1 > 0);
192 }
193 while (s < se)
194 PUT (*s++);
195 if (e < 2)
196 PUT (s[1]);
197 else
198 {
199 while (++e1 <= e)
200 PUT ('0');
201 while (*s)
202 PUT (*s++);
203 }
204 return 0;
205}
206
207int
208wrt_F (ufloat * p, int w, int d, ftnlen len)
209{
210 int d1, sign, n;
211 double x;
212 char *b, buf[MAXINTDIGS + MAXFRACDIGS + 4], *s;
213
214 x = (len == sizeof (real) ? p->pf : p->pd);
215 if (d < MAXFRACDIGS)
216 d1 = 0;
217 else
218 {
219 d1 = d - MAXFRACDIGS;
220 d = MAXFRACDIGS;
221 }
222 if (x < 0.)
223 {
224 x = -x;
225 sign = 1;
226 }
227 else
228 {
229 sign = 0;
230#ifndef VAX
231 if (!x)
232 x = 0.;
233#endif
234 }
235
236 if ((n = f__scale))
237 {
238 if (n > 0)
239 do
240 x *= 10.;
241 while (--n > 0);
242 else
243 do
244 x *= 0.1;
245 while (++n < 0);
246 }
247
248#ifdef USE_STRLEN
249 sprintf (b = buf, "%#.*f", d, x);
250 n = strlen (b) + d1;
251#else
252 n = sprintf (b = buf, "%#.*f", d, x) + d1;
253#endif
254
255#ifndef WANT_LEAD_0
256 if (buf[0] == '0' && d)
257 {
258 ++b;
259 --n;
260 }
261#endif
262 if (sign)
263 {
264 /* check for all zeros */
265 for (s = b;;)
266 {
267 while (*s == '0')
268 s++;
269 switch (*s)
270 {
271 case '.':
272 s++;
273 continue;
274 case 0:
275 sign = 0;
276 }
277 break;
278 }
279 }
280 if (sign || f__cplus)
281 ++n;
282 if (n > w)
283 {
284#ifdef WANT_LEAD_0
285 if (buf[0] == '0' && --n == w)
286 ++b;
287 else
288#endif
289 {
290 while (--w >= 0)
291 PUT ('*');
292 return 0;
293 }
294 }
295 for (w -= n; --w >= 0;)
296 PUT (' ');
297 if (sign)
298 PUT ('-');
299 else if (f__cplus)
300 PUT ('+');
301 while ((n = *b++))
302 PUT (n);
303 while (--d1 >= 0)
304 PUT ('0');
305 return 0;
306}
Note: See TracBrowser for help on using the repository browser.