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