123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- #include "f2c.h"
- #include "fio.h"
- #ifndef KR_headers
- #undef abs
- #undef min
- #undef max
- #include "stdlib.h"
- #include "string.h"
- #endif
- #include "fmt.h"
- #include "fp.h"
- #ifndef VAX
- #include "ctype.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- #endif
- int
- #ifdef KR_headers
- wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
- #else
- wrt_E(ufloat *p, int w, int d, int e, ftnlen len)
- #endif
- {
- char buf[FMAX+EXPMAXDIGS+4], *s, *se;
- int d1, delta, e1, i, sign, signspace;
- double dd;
- #ifdef WANT_LEAD_0
- int insert0 = 0;
- #endif
- #ifndef VAX
- int e0 = e;
- #endif
- if(e <= 0)
- e = 2;
- if(f__scale) {
- if(f__scale >= d + 2 || f__scale <= -d)
- goto nogood;
- }
- if(f__scale <= 0)
- --d;
- if (len == sizeof(real))
- dd = p->pf;
- else
- dd = p->pd;
- if (dd < 0.) {
- signspace = sign = 1;
- dd = -dd;
- }
- else {
- sign = 0;
- signspace = (int)f__cplus;
- #ifndef VAX
- if (!dd) {
- #ifdef SIGNED_ZEROS
- if (signbit_f2c(&dd))
- signspace = sign = 1;
- #endif
- dd = 0.; /* avoid -0 */
- }
- #endif
- }
- delta = w - (2 /* for the . and the d adjustment above */
- + 2 /* for the E+ */ + signspace + d + e);
- #ifdef WANT_LEAD_0
- if (f__scale <= 0 && delta > 0) {
- delta--;
- insert0 = 1;
- }
- else
- #endif
- if (delta < 0) {
- nogood:
- while(--w >= 0)
- PUT('*');
- return(0);
- }
- if (f__scale < 0)
- d += f__scale;
- if (d > FMAX) {
- d1 = d - FMAX;
- d = FMAX;
- }
- else
- d1 = 0;
- sprintf(buf,"%#.*E", d, dd);
- #ifndef VAX
- /* check for NaN, Infinity */
- if (!isdigit(buf[0])) {
- switch(buf[0]) {
- case 'n':
- case 'N':
- signspace = 0; /* no sign for NaNs */
- }
- delta = w - strlen(buf) - signspace;
- if (delta < 0)
- goto nogood;
- while(--delta >= 0)
- PUT(' ');
- if (signspace)
- PUT(sign ? '-' : '+');
- for(s = buf; *s; s++)
- PUT(*s);
- return 0;
- }
- #endif
- se = buf + d + 3;
- #ifdef GOOD_SPRINTF_EXPONENT /* When possible, exponent has 2 digits. */
- if (f__scale != 1 && dd)
- sprintf(se, "%+.2d", atoi(se) + 1 - f__scale);
- #else
- if (dd)
- sprintf(se, "%+.2d", atoi(se) + 1 - f__scale);
- else
- strcpy(se, "+00");
- #endif
- s = ++se;
- if (e < 2) {
- if (*s != '0')
- goto nogood;
- }
- #ifndef VAX
- /* accommodate 3 significant digits in exponent */
- if (s[2]) {
- #ifdef Pedantic
- if (!e0 && !s[3])
- for(s -= 2, e1 = 2; s[0] = s[1]; s++);
- /* Pedantic gives the behavior that Fortran 77 specifies, */
- /* i.e., requires that E be specified for exponent fields */
- /* of more than 3 digits. With Pedantic undefined, we get */
- /* the behavior that Cray displays -- you get a bigger */
- /* exponent field if it fits. */
- #else
- if (!e0) {
- for(s -= 2, e1 = 2; s[0] = s[1]; s++)
- #ifdef CRAY
- delta--;
- if ((delta += 4) < 0)
- goto nogood
- #endif
- ;
- }
- #endif
- else if (e0 >= 0)
- goto shift;
- else
- e1 = e;
- }
- else
- shift:
- #endif
- for(s += 2, e1 = 2; *s; ++e1, ++s)
- if (e1 >= e)
- goto nogood;
- while(--delta >= 0)
- PUT(' ');
- if (signspace)
- PUT(sign ? '-' : '+');
- s = buf;
- i = f__scale;
- if (f__scale <= 0) {
- #ifdef WANT_LEAD_0
- if (insert0)
- PUT('0');
- #endif
- PUT('.');
- for(; i < 0; ++i)
- PUT('0');
- PUT(*s);
- s += 2;
- }
- else if (f__scale > 1) {
- PUT(*s);
- s += 2;
- while(--i > 0)
- PUT(*s++);
- PUT('.');
- }
- if (d1) {
- se -= 2;
- while(s < se) PUT(*s++);
- se += 2;
- do PUT('0'); while(--d1 > 0);
- }
- while(s < se)
- PUT(*s++);
- if (e < 2)
- PUT(s[1]);
- else {
- while(++e1 <= e)
- PUT('0');
- while(*s)
- PUT(*s++);
- }
- return 0;
- }
- int
- #ifdef KR_headers
- wrt_F(p,w,d,len) ufloat *p; ftnlen len;
- #else
- wrt_F(ufloat *p, int w, int d, ftnlen len)
- #endif
- {
- int d1, sign, n;
- double x;
- char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s;
- x= (len==sizeof(real)?p->pf:p->pd);
- if (d < MAXFRACDIGS)
- d1 = 0;
- else {
- d1 = d - MAXFRACDIGS;
- d = MAXFRACDIGS;
- }
- if (x < 0.)
- { x = -x; sign = 1; }
- else {
- sign = 0;
- #ifndef VAX
- if (!x) {
- #ifdef SIGNED_ZEROS
- if (signbit_f2c(&x))
- sign = 2;
- #endif
- x = 0.;
- }
- #endif
- }
- if (n = f__scale)
- if (n > 0)
- do x *= 10.; while(--n > 0);
- else
- do x *= 0.1; while(++n < 0);
- #ifdef USE_STRLEN
- sprintf(b = buf, "%#.*f", d, x);
- n = strlen(b) + d1;
- #else
- n = sprintf(b = buf, "%#.*f", d, x) + d1;
- #endif
- #ifndef WANT_LEAD_0
- if (buf[0] == '0' && d)
- { ++b; --n; }
- #endif
- if (sign == 1) {
- /* check for all zeros */
- for(s = b;;) {
- while(*s == '0') s++;
- switch(*s) {
- case '.':
- s++; continue;
- case 0:
- sign = 0;
- }
- break;
- }
- }
- if (sign || f__cplus)
- ++n;
- if (n > w) {
- #ifdef WANT_LEAD_0
- if (buf[0] == '0' && --n == w)
- ++b;
- else
- #endif
- {
- while(--w >= 0)
- PUT('*');
- return 0;
- }
- }
- for(w -= n; --w >= 0; )
- PUT(' ');
- if (sign)
- PUT('-');
- else if (f__cplus)
- PUT('+');
- while(n = *b++)
- PUT(n);
- while(--d1 >= 0)
- PUT('0');
- return 0;
- }
- #ifdef __cplusplus
- }
- #endif
|