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