xref: /csrg-svn/usr.bin/f77/libI77/lwrite.c (revision 2596)
12497Sdlw /*
2*2596Sdlw char id_lwrite[] = "@(#)lwrite.c	1.2";
32497Sdlw  *
42497Sdlw  * list directed write
52497Sdlw  */
62497Sdlw 
72497Sdlw #include "fio.h"
82497Sdlw #include "lio.h"
92497Sdlw 
102497Sdlw int l_write(), t_putc();
112497Sdlw 
122497Sdlw s_wsle(a) cilist *a;
132497Sdlw {
142497Sdlw 	int n;
152497Sdlw 	reading = NO;
162497Sdlw 	if(n=c_le(a,WRITE)) return(n);
172497Sdlw 	putn = t_putc;
182497Sdlw 	lioproc = l_write;
192497Sdlw 	line_len = LINE;
202497Sdlw 	curunit->uend = NO;
212497Sdlw 	leof = NO;
222497Sdlw 	if(!curunit->uwrt) nowwriting(curunit);
232497Sdlw 	return(OK);
242497Sdlw }
252497Sdlw 
262497Sdlw t_putc(c) char c;
272497Sdlw {
282497Sdlw 	if(c=='\n') recpos=0;
292497Sdlw 	else recpos++;
302497Sdlw 	putc(c,cf);
312497Sdlw 	return(OK);
322497Sdlw }
332497Sdlw 
342497Sdlw e_wsle()
352497Sdlw {	int n;
362497Sdlw 	PUT('\n')
372497Sdlw 	return(OK);
382497Sdlw }
392497Sdlw 
402497Sdlw l_write(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;
412497Sdlw {
422497Sdlw 	int i,n;
432497Sdlw 	ftnint x;
442497Sdlw 	float y,z;
452497Sdlw 	double yd,zd;
462497Sdlw 	float *xx;
472497Sdlw 	double *yy;
482497Sdlw 	for(i=0;i< *number; i++)
492497Sdlw 	{
502497Sdlw 		switch((int)type)
512497Sdlw 		{
522497Sdlw 		case TYSHORT:
532497Sdlw 			x=ptr->flshort;
542497Sdlw 			goto xint;
552497Sdlw 		case TYLONG:
562497Sdlw 			x=ptr->flint;
572497Sdlw 	xint:		ERR(lwrt_I(x));
582497Sdlw 			break;
592497Sdlw 		case TYREAL:
602497Sdlw 			ERR(lwrt_F(ptr->flreal));
612497Sdlw 			break;
622497Sdlw 		case TYDREAL:
632497Sdlw 			ERR(lwrt_D(ptr->fldouble));
642497Sdlw 			break;
652497Sdlw 		case TYCOMPLEX:
662497Sdlw 			xx= &(ptr->flreal);
672497Sdlw 			y = *xx++;
682497Sdlw 			z = *xx;
692497Sdlw 			ERR(lwrt_C(y,z));
702497Sdlw 			break;
712497Sdlw 		case TYDCOMPLEX:
722497Sdlw 			yy = &(ptr->fldouble);
732497Sdlw 			yd= *yy++;
742497Sdlw 			zd = *yy;
752497Sdlw 			ERR(lwrt_DC(yd,zd));
762497Sdlw 			break;
772497Sdlw 		case TYLOGICAL:
782497Sdlw 			ERR(lwrt_L(ptr->flint));
792497Sdlw 			break;
802497Sdlw 		case TYCHAR:
812497Sdlw 			ERR(lwrt_A((char *)ptr,len));
822497Sdlw 			break;
832497Sdlw 		default:
84*2596Sdlw 			fatal(F_ERSYS,"unknown type in lwrite");
852497Sdlw 		}
862497Sdlw 		ptr = (flex *)((char *)ptr + len);
872497Sdlw 	}
882497Sdlw 	return(OK);
892497Sdlw }
902497Sdlw 
912497Sdlw lwrt_I(in) ftnint in;
922497Sdlw {	int n;
932497Sdlw 	char buf[16],*p;
942497Sdlw 	sprintf(buf,"  %ld",(long)in);
952497Sdlw 	if(n=chk_len(LINTW)) return(n);
962497Sdlw 	for(p=buf;*p;) PUT(*p++)
972497Sdlw 	return(OK);
982497Sdlw }
992497Sdlw 
1002497Sdlw lwrt_L(ln) ftnint ln;
1012497Sdlw {	int n;
1022497Sdlw 	if(n=chk_len(LLOGW)) return(n);
1032497Sdlw 	return(wrt_L(&ln,LLOGW));
1042497Sdlw }
1052497Sdlw 
1062497Sdlw lwrt_A(p,len) char *p; ftnlen len;
1072497Sdlw {	int i,n;
1082497Sdlw 	if(n=chk_len(LSTRW)) return(n);
1092497Sdlw 	PUT(' ')
1102497Sdlw 	PUT(' ')
1112497Sdlw 	for(i=0;i<len;i++) PUT(*p++)
1122497Sdlw 	return(OK);
1132497Sdlw }
1142497Sdlw 
1152497Sdlw lwrt_F(fn) float fn;
1162497Sdlw {	int d,n; float x; ufloat f;
1172497Sdlw 	if(fn==0.0) return(lwrt_0());
1182497Sdlw 	f.pf = fn;
1192497Sdlw 	d = width(fn);
1202497Sdlw 	if(n=chk_len(d)) return(n);
1212497Sdlw 	if(d==LFW)
1222497Sdlw 	{
1232497Sdlw 		scale = 0;
1242497Sdlw 		for(d=LFD,x=abs(fn);x>=1.0;x/=10.0,d--);
1252497Sdlw 		return(wrt_F(&f,LFW,d,(ftnlen)sizeof(float)));
1262497Sdlw 	}
1272497Sdlw 	else
1282497Sdlw 	{
1292497Sdlw 		scale = 1;
1302497Sdlw 		return(wrt_E(&f,LEW,LED-scale,LEE,(ftnlen)sizeof(float)));
1312497Sdlw 	}
1322497Sdlw }
1332497Sdlw 
1342497Sdlw lwrt_D(dn) double dn;
1352497Sdlw {	int d,n; double x; ufloat f;
1362497Sdlw 	if(dn==0.0) return(lwrt_0());
1372497Sdlw 	f.pd = dn;
1382497Sdlw 	d = dwidth(dn);
1392497Sdlw 	if(n=chk_len(d)) return(n);
1402497Sdlw 	if(d==LDFW)
1412497Sdlw 	{
1422497Sdlw 		scale = 0;
1432497Sdlw 		for(d=LDFD,x=abs(dn);x>=1.0;x/=10.0,d--);
1442497Sdlw 		return(wrt_F(&f,LDFW,d,(ftnlen)sizeof(double)));
1452497Sdlw 	}
1462497Sdlw 	else
1472497Sdlw 	{
1482497Sdlw 		scale = 1;
1492497Sdlw 		return(wrt_E(&f,LDEW,LDED-scale,LDEE,(ftnlen)sizeof(double)));
1502497Sdlw 	}
1512497Sdlw }
1522497Sdlw 
1532497Sdlw lwrt_C(a,b) float a,b;
1542497Sdlw {	int n;
1552497Sdlw 	if(n=chk_len(LCW)) return(n);
1562497Sdlw 	PUT(' ')
1572497Sdlw 	PUT(' ')
1582497Sdlw 	PUT('(')
1592497Sdlw 	if(n=lwrt_F(a)) return(n);
1602497Sdlw 	PUT(',')
1612497Sdlw 	if(n=lwrt_F(b)) return(n);
1622497Sdlw 	PUT(')')
1632497Sdlw 	return(OK);
1642497Sdlw }
1652497Sdlw 
1662497Sdlw lwrt_DC(a,b) double a,b;
1672497Sdlw {	int n;
1682497Sdlw 	if(n=chk_len(LDCW)) return(n);
1692497Sdlw 	PUT(' ')
1702497Sdlw 	PUT(' ')
1712497Sdlw 	PUT('(')
1722497Sdlw 	if(n=lwrt_D(a)) return(n);
1732497Sdlw 	PUT(',')
1742497Sdlw 	if(n=lwrt_D(b)) return(n);
1752497Sdlw 	PUT(')')
1762497Sdlw 	return(OK);
1772497Sdlw }
1782497Sdlw 
1792497Sdlw lwrt_0()
1802497Sdlw {	int n; char *z = "  0.";
1812497Sdlw 	if(n=chk_len(4)) return(n);
1822497Sdlw 	while(*z) PUT(*z++)
1832497Sdlw 	return(OK);
1842497Sdlw }
1852497Sdlw 
1862497Sdlw chk_len(w)
1872497Sdlw {	int n;
1882497Sdlw 	if(recpos+w > line_len) PUT('\n')
1892497Sdlw 	return(OK);
1902497Sdlw }
191