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