xref: /csrg-svn/usr.bin/f77/libI77/lwrite.c (revision 24101)
12497Sdlw /*
223080Skre  * Copyright (c) 1980 Regents of the University of California.
323080Skre  * All rights reserved.  The Berkeley software License Agreement
423080Skre  * specifies the terms and conditions for redistribution.
52497Sdlw  *
6*24101Sjerry  *	@(#)lwrite.c	5.2	07/30/85
723080Skre  */
823080Skre 
923080Skre /*
102497Sdlw  * list directed write
112497Sdlw  */
122497Sdlw 
132497Sdlw #include "fio.h"
142497Sdlw #include "lio.h"
152497Sdlw 
162497Sdlw int l_write(), t_putc();
1720984Slibs LOCAL char lwrt[] = "list write";
182497Sdlw 
192497Sdlw s_wsle(a) cilist *a;
202497Sdlw {
212497Sdlw 	int n;
222497Sdlw 	reading = NO;
23*24101Sjerry 	formatted = LISTDIRECTED;
24*24101Sjerry 	fmtbuf = "ext list io";
252497Sdlw 	if(n=c_le(a,WRITE)) return(n);
262497Sdlw 	putn = t_putc;
272497Sdlw 	lioproc = l_write;
282497Sdlw 	line_len = LINE;
292497Sdlw 	curunit->uend = NO;
302497Sdlw 	leof = NO;
314118Sdlw 	if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, lwrt)
322497Sdlw 	return(OK);
332497Sdlw }
342497Sdlw 
3520984Slibs LOCAL
362497Sdlw t_putc(c) char c;
372497Sdlw {
382497Sdlw 	if(c=='\n') recpos=0;
392497Sdlw 	else recpos++;
402497Sdlw 	putc(c,cf);
412497Sdlw 	return(OK);
422497Sdlw }
432497Sdlw 
442497Sdlw e_wsle()
452497Sdlw {	int n;
462497Sdlw 	PUT('\n')
472497Sdlw 	return(OK);
482497Sdlw }
492497Sdlw 
502497Sdlw l_write(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;
512497Sdlw {
522497Sdlw 	int i,n;
532497Sdlw 	ftnint x;
542497Sdlw 	float y,z;
552497Sdlw 	double yd,zd;
562497Sdlw 	float *xx;
572497Sdlw 	double *yy;
582497Sdlw 	for(i=0;i< *number; i++)
592497Sdlw 	{
60*24101Sjerry 		if( formatted == NAMELIST && i != 0 ) PUT(',');
612497Sdlw 		switch((int)type)
622497Sdlw 		{
632497Sdlw 		case TYSHORT:
642497Sdlw 			x=ptr->flshort;
652497Sdlw 			goto xint;
662497Sdlw 		case TYLONG:
672497Sdlw 			x=ptr->flint;
68*24101Sjerry 	xint:		ERRCHK(lwrt_I(x));
692497Sdlw 			break;
702497Sdlw 		case TYREAL:
71*24101Sjerry 			ERRCHK(lwrt_F(ptr->flreal));
722497Sdlw 			break;
732497Sdlw 		case TYDREAL:
74*24101Sjerry 			ERRCHK(lwrt_D(ptr->fldouble));
752497Sdlw 			break;
762497Sdlw 		case TYCOMPLEX:
772497Sdlw 			xx= &(ptr->flreal);
782497Sdlw 			y = *xx++;
792497Sdlw 			z = *xx;
80*24101Sjerry 			ERRCHK(lwrt_C(y,z));
812497Sdlw 			break;
822497Sdlw 		case TYDCOMPLEX:
832497Sdlw 			yy = &(ptr->fldouble);
842497Sdlw 			yd= *yy++;
852497Sdlw 			zd = *yy;
86*24101Sjerry 			ERRCHK(lwrt_DC(yd,zd));
872497Sdlw 			break;
882497Sdlw 		case TYLOGICAL:
8922598Sjerry 			if(len == sizeof(short))
9022598Sjerry 				x = ptr->flshort;
9122598Sjerry 			else
9222598Sjerry 				x = ptr->flint;
93*24101Sjerry 			ERRCHK(lwrt_L(x));
942497Sdlw 			break;
952497Sdlw 		case TYCHAR:
96*24101Sjerry 			ERRCHK(lwrt_A((char *)ptr,len));
972497Sdlw 			break;
982497Sdlw 		default:
992596Sdlw 			fatal(F_ERSYS,"unknown type in lwrite");
1002497Sdlw 		}
1012497Sdlw 		ptr = (flex *)((char *)ptr + len);
1022497Sdlw 	}
1032497Sdlw 	return(OK);
104*24101Sjerry 
105*24101Sjerry got_err:
106*24101Sjerry 	err( n>0?errflag:endflag,  n,
107*24101Sjerry 		formatted==LISTDIRECTED?"list io":"name list io");
1082497Sdlw }
1092497Sdlw 
11020984Slibs LOCAL
1112497Sdlw lwrt_I(in) ftnint in;
1122497Sdlw {	int n;
1132497Sdlw 	char buf[16],*p;
1142497Sdlw 	sprintf(buf,"  %ld",(long)in);
115*24101Sjerry 	chk_len(LINTW);
1162497Sdlw 	for(p=buf;*p;) PUT(*p++)
1172497Sdlw 	return(OK);
1182497Sdlw }
1192497Sdlw 
12020984Slibs LOCAL
1212497Sdlw lwrt_L(ln) ftnint ln;
1222497Sdlw {	int n;
123*24101Sjerry 	chk_len(LLOGW);
1242497Sdlw 	return(wrt_L(&ln,LLOGW));
1252497Sdlw }
1262497Sdlw 
12720984Slibs LOCAL
1282497Sdlw lwrt_A(p,len) char *p; ftnlen len;
1292497Sdlw {	int i,n;
130*24101Sjerry 	chk_len(LSTRW);
131*24101Sjerry 	if(formatted == LISTDIRECTED)
132*24101Sjerry 	{
133*24101Sjerry 		PUT(' ')
134*24101Sjerry 		PUT(' ')
135*24101Sjerry 		for(i=0;i<len;i++) PUT(*p++)
136*24101Sjerry 	}
137*24101Sjerry 	else
138*24101Sjerry 	{
139*24101Sjerry 		PUT('\'')
140*24101Sjerry 		for(i=0;i<len;i++) PUT(*p++)
141*24101Sjerry 		PUT('\'')
142*24101Sjerry 	}
1432497Sdlw 	return(OK);
1442497Sdlw }
1452497Sdlw 
14620984Slibs LOCAL
1472497Sdlw lwrt_F(fn) float fn;
1482497Sdlw {	int d,n; float x; ufloat f;
1492497Sdlw 	if(fn==0.0) return(lwrt_0());
1502497Sdlw 	f.pf = fn;
1512497Sdlw 	d = width(fn);
152*24101Sjerry 	chk_len(d);
1532497Sdlw 	if(d==LFW)
1542497Sdlw 	{
1552497Sdlw 		scale = 0;
1562497Sdlw 		for(d=LFD,x=abs(fn);x>=1.0;x/=10.0,d--);
1572497Sdlw 		return(wrt_F(&f,LFW,d,(ftnlen)sizeof(float)));
1582497Sdlw 	}
1592497Sdlw 	else
1602497Sdlw 	{
1612497Sdlw 		scale = 1;
16212040Sdlw 		return(wrt_E(&f,LEW,LED-scale,LEE,(ftnlen)sizeof(float),'e'));
1632497Sdlw 	}
1642497Sdlw }
1652497Sdlw 
16620984Slibs LOCAL
1672497Sdlw lwrt_D(dn) double dn;
1682497Sdlw {	int d,n; double x; ufloat f;
1692497Sdlw 	if(dn==0.0) return(lwrt_0());
1702497Sdlw 	f.pd = dn;
1712497Sdlw 	d = dwidth(dn);
172*24101Sjerry 	chk_len(d);
1732497Sdlw 	if(d==LDFW)
1742497Sdlw 	{
1752497Sdlw 		scale = 0;
1762497Sdlw 		for(d=LDFD,x=abs(dn);x>=1.0;x/=10.0,d--);
1772497Sdlw 		return(wrt_F(&f,LDFW,d,(ftnlen)sizeof(double)));
1782497Sdlw 	}
1792497Sdlw 	else
1802497Sdlw 	{
1812497Sdlw 		scale = 1;
18212040Sdlw 		return(wrt_E(&f,LDEW,LDED-scale,LDEE,(ftnlen)sizeof(double),'d'));
1832497Sdlw 	}
1842497Sdlw }
1852497Sdlw 
18620984Slibs LOCAL
1872497Sdlw lwrt_C(a,b) float a,b;
1882497Sdlw {	int n;
189*24101Sjerry 	chk_len(LCW);
1902497Sdlw 	PUT(' ')
1912497Sdlw 	PUT(' ')
1922497Sdlw 	PUT('(')
1932497Sdlw 	if(n=lwrt_F(a)) return(n);
1942497Sdlw 	PUT(',')
1952497Sdlw 	if(n=lwrt_F(b)) return(n);
1962497Sdlw 	PUT(')')
1972497Sdlw 	return(OK);
1982497Sdlw }
1992497Sdlw 
20020984Slibs LOCAL
2012497Sdlw lwrt_DC(a,b) double a,b;
2022497Sdlw {	int n;
203*24101Sjerry 	chk_len(LDCW);
2042497Sdlw 	PUT(' ')
2052497Sdlw 	PUT(' ')
2062497Sdlw 	PUT('(')
2072497Sdlw 	if(n=lwrt_D(a)) return(n);
2082497Sdlw 	PUT(',')
2092497Sdlw 	if(n=lwrt_D(b)) return(n);
2102497Sdlw 	PUT(')')
2112497Sdlw 	return(OK);
2122497Sdlw }
2132497Sdlw 
21420984Slibs LOCAL
2152497Sdlw lwrt_0()
2162497Sdlw {	int n; char *z = "  0.";
217*24101Sjerry 	chk_len(4);
2182497Sdlw 	while(*z) PUT(*z++)
2192497Sdlw 	return(OK);
2202497Sdlw }
221