| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 | #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 __cplusplusextern "C" {#endif#endif int#ifdef KR_headerswrt_E(p,w,d,e,len) ufloat *p; ftnlen len;#elsewrt_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_headerswrt_F(p,w,d,len) ufloat *p; ftnlen len;#elsewrt_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
 |