source: branches/libc-0.6/src/gcc/libf2c/libI77/wref.c

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

This commit was generated by cvs2svn to compensate for changes in r1391,
which included commits to RCS files with non-trunk default branches.

  • 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.