xref: /csrg-svn/usr.bin/f77/libI77/lwrite.c (revision 47943)
1*47943Sbostic /*-
2*47943Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic  * All rights reserved.
42497Sdlw  *
5*47943Sbostic  * %sccs.include.proprietary.c%
623080Skre  */
723080Skre 
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)lwrite.c	5.4 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic 
1223080Skre /*
132497Sdlw  * list directed write
142497Sdlw  */
152497Sdlw 
162497Sdlw #include "fio.h"
172497Sdlw #include "lio.h"
182497Sdlw 
192497Sdlw int l_write(), t_putc();
2020984Slibs LOCAL char lwrt[] = "list write";
212497Sdlw 
s_wsle(a)222497Sdlw s_wsle(a) cilist *a;
232497Sdlw {
242497Sdlw 	int n;
252497Sdlw 	reading = NO;
2624101Sjerry 	formatted = LISTDIRECTED;
2724101Sjerry 	fmtbuf = "ext list io";
282497Sdlw 	if(n=c_le(a,WRITE)) return(n);
292497Sdlw 	putn = t_putc;
302497Sdlw 	lioproc = l_write;
312497Sdlw 	line_len = LINE;
322497Sdlw 	curunit->uend = NO;
332497Sdlw 	leof = NO;
344118Sdlw 	if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, lwrt)
352497Sdlw 	return(OK);
362497Sdlw }
372497Sdlw 
3820984Slibs LOCAL
t_putc(c)392497Sdlw t_putc(c) char c;
402497Sdlw {
412497Sdlw 	if(c=='\n') recpos=0;
422497Sdlw 	else recpos++;
432497Sdlw 	putc(c,cf);
442497Sdlw 	return(OK);
452497Sdlw }
462497Sdlw 
e_wsle()472497Sdlw e_wsle()
482497Sdlw {	int n;
492497Sdlw 	PUT('\n')
502497Sdlw 	return(OK);
512497Sdlw }
522497Sdlw 
l_write(number,ptr,len,type)532497Sdlw l_write(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;
542497Sdlw {
552497Sdlw 	int i,n;
562497Sdlw 	ftnint x;
572497Sdlw 	float y,z;
582497Sdlw 	double yd,zd;
592497Sdlw 	float *xx;
602497Sdlw 	double *yy;
612497Sdlw 	for(i=0;i< *number; i++)
622497Sdlw 	{
6324101Sjerry 		if( formatted == NAMELIST && i != 0 ) PUT(',');
642497Sdlw 		switch((int)type)
652497Sdlw 		{
662497Sdlw 		case TYSHORT:
672497Sdlw 			x=ptr->flshort;
682497Sdlw 			goto xint;
692497Sdlw 		case TYLONG:
702497Sdlw 			x=ptr->flint;
7124101Sjerry 	xint:		ERRCHK(lwrt_I(x));
722497Sdlw 			break;
732497Sdlw 		case TYREAL:
7424101Sjerry 			ERRCHK(lwrt_F(ptr->flreal));
752497Sdlw 			break;
762497Sdlw 		case TYDREAL:
7724101Sjerry 			ERRCHK(lwrt_D(ptr->fldouble));
782497Sdlw 			break;
792497Sdlw 		case TYCOMPLEX:
802497Sdlw 			xx= &(ptr->flreal);
812497Sdlw 			y = *xx++;
822497Sdlw 			z = *xx;
8324101Sjerry 			ERRCHK(lwrt_C(y,z));
842497Sdlw 			break;
852497Sdlw 		case TYDCOMPLEX:
862497Sdlw 			yy = &(ptr->fldouble);
872497Sdlw 			yd= *yy++;
882497Sdlw 			zd = *yy;
8924101Sjerry 			ERRCHK(lwrt_DC(yd,zd));
902497Sdlw 			break;
912497Sdlw 		case TYLOGICAL:
9222598Sjerry 			if(len == sizeof(short))
9322598Sjerry 				x = ptr->flshort;
9422598Sjerry 			else
9522598Sjerry 				x = ptr->flint;
9624101Sjerry 			ERRCHK(lwrt_L(x));
972497Sdlw 			break;
982497Sdlw 		case TYCHAR:
9924101Sjerry 			ERRCHK(lwrt_A((char *)ptr,len));
1002497Sdlw 			break;
1012497Sdlw 		default:
1022596Sdlw 			fatal(F_ERSYS,"unknown type in lwrite");
1032497Sdlw 		}
1042497Sdlw 		ptr = (flex *)((char *)ptr + len);
1052497Sdlw 	}
1062497Sdlw 	return(OK);
10724101Sjerry 
10824101Sjerry got_err:
10924101Sjerry 	err( n>0?errflag:endflag,  n,
11024101Sjerry 		formatted==LISTDIRECTED?"list io":"name list io");
1112497Sdlw }
1122497Sdlw 
11320984Slibs LOCAL
lwrt_I(in)1142497Sdlw lwrt_I(in) ftnint in;
1152497Sdlw {	int n;
1162497Sdlw 	char buf[16],*p;
1172497Sdlw 	sprintf(buf,"  %ld",(long)in);
11824101Sjerry 	chk_len(LINTW);
1192497Sdlw 	for(p=buf;*p;) PUT(*p++)
1202497Sdlw 	return(OK);
1212497Sdlw }
1222497Sdlw 
12320984Slibs LOCAL
lwrt_L(ln)1242497Sdlw lwrt_L(ln) ftnint ln;
1252497Sdlw {	int n;
12624101Sjerry 	chk_len(LLOGW);
1272497Sdlw 	return(wrt_L(&ln,LLOGW));
1282497Sdlw }
1292497Sdlw 
13020984Slibs LOCAL
lwrt_A(p,len)1312497Sdlw lwrt_A(p,len) char *p; ftnlen len;
1322497Sdlw {	int i,n;
13324101Sjerry 	if(formatted == LISTDIRECTED)
13424101Sjerry 	{
13531955Sbostic 		chk_len(len);
13624101Sjerry 		for(i=0;i<len;i++) PUT(*p++)
13724101Sjerry 	}
13824101Sjerry 	else
13924101Sjerry 	{
14031955Sbostic 		chk_len(len+2);
14124101Sjerry 		PUT('\'')
14224101Sjerry 		for(i=0;i<len;i++) PUT(*p++)
14324101Sjerry 		PUT('\'')
14424101Sjerry 	}
1452497Sdlw 	return(OK);
1462497Sdlw }
1472497Sdlw 
14820984Slibs LOCAL
lwrt_F(fn)1492497Sdlw lwrt_F(fn) float fn;
1502497Sdlw {	int d,n; float x; ufloat f;
1512497Sdlw 	if(fn==0.0) return(lwrt_0());
1522497Sdlw 	f.pf = fn;
1532497Sdlw 	d = width(fn);
15424101Sjerry 	chk_len(d);
1552497Sdlw 	if(d==LFW)
1562497Sdlw 	{
1572497Sdlw 		scale = 0;
1582497Sdlw 		for(d=LFD,x=abs(fn);x>=1.0;x/=10.0,d--);
1592497Sdlw 		return(wrt_F(&f,LFW,d,(ftnlen)sizeof(float)));
1602497Sdlw 	}
1612497Sdlw 	else
1622497Sdlw 	{
1632497Sdlw 		scale = 1;
16412040Sdlw 		return(wrt_E(&f,LEW,LED-scale,LEE,(ftnlen)sizeof(float),'e'));
1652497Sdlw 	}
1662497Sdlw }
1672497Sdlw 
16820984Slibs LOCAL
lwrt_D(dn)1692497Sdlw lwrt_D(dn) double dn;
1702497Sdlw {	int d,n; double x; ufloat f;
1712497Sdlw 	if(dn==0.0) return(lwrt_0());
1722497Sdlw 	f.pd = dn;
1732497Sdlw 	d = dwidth(dn);
17424101Sjerry 	chk_len(d);
1752497Sdlw 	if(d==LDFW)
1762497Sdlw 	{
1772497Sdlw 		scale = 0;
1782497Sdlw 		for(d=LDFD,x=abs(dn);x>=1.0;x/=10.0,d--);
1792497Sdlw 		return(wrt_F(&f,LDFW,d,(ftnlen)sizeof(double)));
1802497Sdlw 	}
1812497Sdlw 	else
1822497Sdlw 	{
1832497Sdlw 		scale = 1;
18412040Sdlw 		return(wrt_E(&f,LDEW,LDED-scale,LDEE,(ftnlen)sizeof(double),'d'));
1852497Sdlw 	}
1862497Sdlw }
1872497Sdlw 
18820984Slibs LOCAL
lwrt_C(a,b)1892497Sdlw lwrt_C(a,b) float a,b;
1902497Sdlw {	int n;
19124101Sjerry 	chk_len(LCW);
1922497Sdlw 	PUT(' ')
1932497Sdlw 	PUT(' ')
1942497Sdlw 	PUT('(')
1952497Sdlw 	if(n=lwrt_F(a)) return(n);
1962497Sdlw 	PUT(',')
1972497Sdlw 	if(n=lwrt_F(b)) return(n);
1982497Sdlw 	PUT(')')
1992497Sdlw 	return(OK);
2002497Sdlw }
2012497Sdlw 
20220984Slibs LOCAL
lwrt_DC(a,b)2032497Sdlw lwrt_DC(a,b) double a,b;
2042497Sdlw {	int n;
20524101Sjerry 	chk_len(LDCW);
2062497Sdlw 	PUT(' ')
2072497Sdlw 	PUT(' ')
2082497Sdlw 	PUT('(')
2092497Sdlw 	if(n=lwrt_D(a)) return(n);
2102497Sdlw 	PUT(',')
2112497Sdlw 	if(n=lwrt_D(b)) return(n);
2122497Sdlw 	PUT(')')
2132497Sdlw 	return(OK);
2142497Sdlw }
2152497Sdlw 
21620984Slibs LOCAL
lwrt_0()2172497Sdlw lwrt_0()
2182497Sdlw {	int n; char *z = "  0.";
21924101Sjerry 	chk_len(4);
2202497Sdlw 	while(*z) PUT(*z++)
2212497Sdlw 	return(OK);
2222497Sdlw }
223