12497Sdlw /* 2*23080Skre * Copyright (c) 1980 Regents of the University of California. 3*23080Skre * All rights reserved. The Berkeley software License Agreement 4*23080Skre * specifies the terms and conditions for redistribution. 52497Sdlw * 6*23080Skre * @(#)lwrite.c 5.1 06/07/85 7*23080Skre */ 8*23080Skre 9*23080Skre /* 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; 232497Sdlw if(n=c_le(a,WRITE)) return(n); 242497Sdlw putn = t_putc; 252497Sdlw lioproc = l_write; 262497Sdlw line_len = LINE; 272497Sdlw curunit->uend = NO; 282497Sdlw leof = NO; 294118Sdlw if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, lwrt) 302497Sdlw return(OK); 312497Sdlw } 322497Sdlw 3320984Slibs LOCAL 342497Sdlw t_putc(c) char c; 352497Sdlw { 362497Sdlw if(c=='\n') recpos=0; 372497Sdlw else recpos++; 382497Sdlw putc(c,cf); 392497Sdlw return(OK); 402497Sdlw } 412497Sdlw 422497Sdlw e_wsle() 432497Sdlw { int n; 442497Sdlw PUT('\n') 452497Sdlw return(OK); 462497Sdlw } 472497Sdlw 482497Sdlw l_write(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len; 492497Sdlw { 502497Sdlw int i,n; 512497Sdlw ftnint x; 522497Sdlw float y,z; 532497Sdlw double yd,zd; 542497Sdlw float *xx; 552497Sdlw double *yy; 562497Sdlw for(i=0;i< *number; i++) 572497Sdlw { 582497Sdlw switch((int)type) 592497Sdlw { 602497Sdlw case TYSHORT: 612497Sdlw x=ptr->flshort; 622497Sdlw goto xint; 632497Sdlw case TYLONG: 642497Sdlw x=ptr->flint; 652497Sdlw xint: ERR(lwrt_I(x)); 662497Sdlw break; 672497Sdlw case TYREAL: 682497Sdlw ERR(lwrt_F(ptr->flreal)); 692497Sdlw break; 702497Sdlw case TYDREAL: 712497Sdlw ERR(lwrt_D(ptr->fldouble)); 722497Sdlw break; 732497Sdlw case TYCOMPLEX: 742497Sdlw xx= &(ptr->flreal); 752497Sdlw y = *xx++; 762497Sdlw z = *xx; 772497Sdlw ERR(lwrt_C(y,z)); 782497Sdlw break; 792497Sdlw case TYDCOMPLEX: 802497Sdlw yy = &(ptr->fldouble); 812497Sdlw yd= *yy++; 822497Sdlw zd = *yy; 832497Sdlw ERR(lwrt_DC(yd,zd)); 842497Sdlw break; 852497Sdlw case TYLOGICAL: 8622598Sjerry if(len == sizeof(short)) 8722598Sjerry x = ptr->flshort; 8822598Sjerry else 8922598Sjerry x = ptr->flint; 9022598Sjerry ERR(lwrt_L(x)); 912497Sdlw break; 922497Sdlw case TYCHAR: 932497Sdlw ERR(lwrt_A((char *)ptr,len)); 942497Sdlw break; 952497Sdlw default: 962596Sdlw fatal(F_ERSYS,"unknown type in lwrite"); 972497Sdlw } 982497Sdlw ptr = (flex *)((char *)ptr + len); 992497Sdlw } 1002497Sdlw return(OK); 1012497Sdlw } 1022497Sdlw 10320984Slibs LOCAL 1042497Sdlw lwrt_I(in) ftnint in; 1052497Sdlw { int n; 1062497Sdlw char buf[16],*p; 1072497Sdlw sprintf(buf," %ld",(long)in); 1082497Sdlw if(n=chk_len(LINTW)) return(n); 1092497Sdlw for(p=buf;*p;) PUT(*p++) 1102497Sdlw return(OK); 1112497Sdlw } 1122497Sdlw 11320984Slibs LOCAL 1142497Sdlw lwrt_L(ln) ftnint ln; 1152497Sdlw { int n; 1162497Sdlw if(n=chk_len(LLOGW)) return(n); 1172497Sdlw return(wrt_L(&ln,LLOGW)); 1182497Sdlw } 1192497Sdlw 12020984Slibs LOCAL 1212497Sdlw lwrt_A(p,len) char *p; ftnlen len; 1222497Sdlw { int i,n; 1232497Sdlw if(n=chk_len(LSTRW)) return(n); 1242497Sdlw PUT(' ') 1252497Sdlw PUT(' ') 1262497Sdlw for(i=0;i<len;i++) PUT(*p++) 1272497Sdlw return(OK); 1282497Sdlw } 1292497Sdlw 13020984Slibs LOCAL 1312497Sdlw lwrt_F(fn) float fn; 1322497Sdlw { int d,n; float x; ufloat f; 1332497Sdlw if(fn==0.0) return(lwrt_0()); 1342497Sdlw f.pf = fn; 1352497Sdlw d = width(fn); 1362497Sdlw if(n=chk_len(d)) return(n); 1372497Sdlw if(d==LFW) 1382497Sdlw { 1392497Sdlw scale = 0; 1402497Sdlw for(d=LFD,x=abs(fn);x>=1.0;x/=10.0,d--); 1412497Sdlw return(wrt_F(&f,LFW,d,(ftnlen)sizeof(float))); 1422497Sdlw } 1432497Sdlw else 1442497Sdlw { 1452497Sdlw scale = 1; 14612040Sdlw return(wrt_E(&f,LEW,LED-scale,LEE,(ftnlen)sizeof(float),'e')); 1472497Sdlw } 1482497Sdlw } 1492497Sdlw 15020984Slibs LOCAL 1512497Sdlw lwrt_D(dn) double dn; 1522497Sdlw { int d,n; double x; ufloat f; 1532497Sdlw if(dn==0.0) return(lwrt_0()); 1542497Sdlw f.pd = dn; 1552497Sdlw d = dwidth(dn); 1562497Sdlw if(n=chk_len(d)) return(n); 1572497Sdlw if(d==LDFW) 1582497Sdlw { 1592497Sdlw scale = 0; 1602497Sdlw for(d=LDFD,x=abs(dn);x>=1.0;x/=10.0,d--); 1612497Sdlw return(wrt_F(&f,LDFW,d,(ftnlen)sizeof(double))); 1622497Sdlw } 1632497Sdlw else 1642497Sdlw { 1652497Sdlw scale = 1; 16612040Sdlw return(wrt_E(&f,LDEW,LDED-scale,LDEE,(ftnlen)sizeof(double),'d')); 1672497Sdlw } 1682497Sdlw } 1692497Sdlw 17020984Slibs LOCAL 1712497Sdlw lwrt_C(a,b) float a,b; 1722497Sdlw { int n; 1732497Sdlw if(n=chk_len(LCW)) return(n); 1742497Sdlw PUT(' ') 1752497Sdlw PUT(' ') 1762497Sdlw PUT('(') 1772497Sdlw if(n=lwrt_F(a)) return(n); 1782497Sdlw PUT(',') 1792497Sdlw if(n=lwrt_F(b)) return(n); 1802497Sdlw PUT(')') 1812497Sdlw return(OK); 1822497Sdlw } 1832497Sdlw 18420984Slibs LOCAL 1852497Sdlw lwrt_DC(a,b) double a,b; 1862497Sdlw { int n; 1872497Sdlw if(n=chk_len(LDCW)) return(n); 1882497Sdlw PUT(' ') 1892497Sdlw PUT(' ') 1902497Sdlw PUT('(') 1912497Sdlw if(n=lwrt_D(a)) return(n); 1922497Sdlw PUT(',') 1932497Sdlw if(n=lwrt_D(b)) return(n); 1942497Sdlw PUT(')') 1952497Sdlw return(OK); 1962497Sdlw } 1972497Sdlw 19820984Slibs LOCAL 1992497Sdlw lwrt_0() 2002497Sdlw { int n; char *z = " 0."; 2012497Sdlw if(n=chk_len(4)) return(n); 2022497Sdlw while(*z) PUT(*z++) 2032497Sdlw return(OK); 2042497Sdlw } 2052497Sdlw 20620984Slibs LOCAL 2072497Sdlw chk_len(w) 2082497Sdlw { int n; 2092497Sdlw if(recpos+w > line_len) PUT('\n') 2102497Sdlw return(OK); 2112497Sdlw } 212