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