12494Sdlw /* 2*2593Sdlw char id_iio[] = "@(#)iio.c 1.2"; 32494Sdlw * 42494Sdlw * internal (character array) i/o 52494Sdlw */ 62494Sdlw 72494Sdlw #include "fio.h" 82494Sdlw #include "lio.h" 92494Sdlw 102494Sdlw extern int rd_ed(),rd_ned(),w_ed(),w_ned(); 112494Sdlw extern int l_read(),l_write(); 122494Sdlw int z_wnew(),z_rnew(),z_tab(); 132494Sdlw 142494Sdlw z_getc() 152494Sdlw { 162494Sdlw if(icptr >= icend && !recpos) /* new rec beyond eof */ 172494Sdlw { leof = EOF; 182494Sdlw return(EOF); 192494Sdlw } 202494Sdlw if(recpos++ < svic->icirlen) return(*icptr++); 212494Sdlw return(' '); 222494Sdlw } 232494Sdlw 242494Sdlw z_putc(c) char c; 252494Sdlw { 262494Sdlw if(icptr < icend) 272494Sdlw { if(c=='\n') return(z_wnew()); 282494Sdlw if(recpos++ < svic->icirlen) 292494Sdlw { *icptr++ = c; 302494Sdlw return(OK); 312494Sdlw } 32*2593Sdlw else err(errflag,F_EREREC,"iio") 332494Sdlw } 342494Sdlw leof = EOF; 352494Sdlw #ifndef KOSHER 362494Sdlw err(endflag,EOF,"iio") /* NOT STANDARD, end-of-file on writes */ 372494Sdlw #endif 382494Sdlw #ifdef KOSHER 39*2593Sdlw err(errflag,F_EREREC,"iio") 402494Sdlw #endif 412494Sdlw } 422494Sdlw 432494Sdlw z_ungetc(ch,cf) char ch; 442494Sdlw { if(ch==EOF || --recpos >= svic->icirlen) return(OK); 45*2593Sdlw if(--icptr < svic->iciunit || recpos < 0) err(errflag,F_ERBREC,"ilio") 462494Sdlw *icptr = ch; 472494Sdlw return(OK); 482494Sdlw } 492494Sdlw 502494Sdlw s_rsfi(a) icilist *a; 512494Sdlw { 522494Sdlw reading = YES; 532494Sdlw doed=rd_ed; 542494Sdlw doned=rd_ned; 552494Sdlw getn=z_getc; 562494Sdlw doend = donewrec = z_rnew; 572494Sdlw dorevert = z_rnew; 582494Sdlw dotab = z_tab; 592494Sdlw return(c_si(a)); 602494Sdlw } 612494Sdlw 622494Sdlw s_wsfi(a) icilist *a; 632494Sdlw { 642494Sdlw reading = NO; 652494Sdlw doed=w_ed; 662494Sdlw doned=w_ned; 672494Sdlw putn=z_putc; 682494Sdlw doend = donewrec = z_wnew; 692494Sdlw dorevert = z_wnew; 702494Sdlw dotab = z_tab; 712494Sdlw return(c_si(a)); 722494Sdlw } 732494Sdlw 742494Sdlw s_rdfi(a) icilist *a; 752494Sdlw { 762494Sdlw reading = YES; 772494Sdlw doed = rd_ed; 782494Sdlw doned = rd_ned; 792494Sdlw getn = z_getc; 802494Sdlw donewrec = z_rnew; 812494Sdlw dorevert = doend = z_rnew; 822494Sdlw dotab = z_tab; 832494Sdlw return(c_di(a)); 842494Sdlw } 852494Sdlw 862494Sdlw s_wdfi(a) icilist *a; 872494Sdlw { 882494Sdlw reading = NO; 892494Sdlw doed = w_ed; 902494Sdlw doned = w_ned; 912494Sdlw putn = z_putc; 922494Sdlw donewrec = z_wnew; 932494Sdlw dorevert = doend = z_wnew; 942494Sdlw dotab = z_tab; 952494Sdlw return(c_di(a)); 962494Sdlw } 972494Sdlw 982494Sdlw c_fi(a) icilist *a; 992494Sdlw { 1002494Sdlw fmtbuf=a->icifmt; 1012494Sdlw formatted = FORMATTED; 1022494Sdlw external = NO; 1032494Sdlw cblank=cplus=NO; 1042494Sdlw scale=cursor=0; 1052494Sdlw radix = 10; 1062494Sdlw signit = YES; 1072494Sdlw elist = YES; 1082494Sdlw svic = a; 1092494Sdlw recpos=reclen=0; 1102494Sdlw icend = a->iciunit + a->icirnum*a->icirlen; 1112494Sdlw errflag = a->icierr; 1122494Sdlw endflag = a->iciend; 113*2593Sdlw if(pars_f(fmtbuf)) err(errflag,F_ERFMT,"ifio") 1142494Sdlw fmt_bg(); 1152494Sdlw return(OK); 1162494Sdlw } 1172494Sdlw 1182494Sdlw c_si(a) icilist *a; 1192494Sdlw { 1202494Sdlw sequential = YES; 1212494Sdlw recnum = 0; 1222494Sdlw icptr = a->iciunit; 1232494Sdlw return(c_fi(a)); 1242494Sdlw } 1252494Sdlw 1262494Sdlw c_di(a) icilist *a; 1272494Sdlw { 1282494Sdlw sequential = NO; 1292494Sdlw recnum = a->icirec - 1; 1302494Sdlw icptr = a->iciunit + recnum*a->icirlen; 1312494Sdlw return(c_fi(a)); 1322494Sdlw } 1332494Sdlw 1342494Sdlw z_rnew() 1352494Sdlw { 1362494Sdlw icptr = svic->iciunit + (++recnum)*svic->icirlen; 1372494Sdlw recpos = reclen = cursor = 0; 1382494Sdlw return(OK); 1392494Sdlw } 1402494Sdlw 1412494Sdlw z_wnew() 1422494Sdlw { 1432494Sdlw if(reclen > recpos) 1442494Sdlw { icptr += (reclen - recpos); 1452494Sdlw recpos = reclen; 1462494Sdlw } 1472494Sdlw while(recpos < svic->icirlen) (*putn)(' '); 1482494Sdlw recpos = reclen = cursor = 0; 1492494Sdlw recnum++; 1502494Sdlw return(OK); 1512494Sdlw } 1522494Sdlw 1532494Sdlw z_tab() 1542494Sdlw { int n; 1552494Sdlw if(reclen < recpos) reclen = recpos; 156*2593Sdlw if((recpos + cursor) < 0) return(F_ERBREC); 1572494Sdlw n = reclen - recpos; 1582494Sdlw if(!reading && (cursor-n) > 0) 1592494Sdlw { icptr += n; 1602494Sdlw recpos = reclen; 1612494Sdlw cursor -= n; 1622494Sdlw while(cursor--) if(n=(*putn)(' ')) return(n); 1632494Sdlw } 1642494Sdlw else 1652494Sdlw { icptr += cursor; 1662494Sdlw recpos += cursor; 1672494Sdlw } 1682494Sdlw return(cursor=0); 1692494Sdlw } 1702494Sdlw 1712494Sdlw e_rsfi() 1722494Sdlw { int n; 1732494Sdlw n = en_fio(); 1742494Sdlw fmtbuf = NULL; 1752494Sdlw return(n); 1762494Sdlw } 1772494Sdlw 1782494Sdlw e_wsfi() 1792494Sdlw { 1802494Sdlw return(e_rsfi()); 1812494Sdlw } 1822494Sdlw 1832494Sdlw e_rdfi() 1842494Sdlw { 1852494Sdlw return(e_rsfi()); 1862494Sdlw } 1872494Sdlw 1882494Sdlw e_wdfi() 1892494Sdlw { 1902494Sdlw return(e_wsfi()); 1912494Sdlw } 1922494Sdlw 1932494Sdlw c_li(a) icilist *a; 1942494Sdlw { 1952494Sdlw fmtbuf="int list io"; 1962494Sdlw sequential = formatted = LISTDIRECTED; 1972494Sdlw external = NO; 1982494Sdlw elist = YES; 1992494Sdlw svic = a; 2002494Sdlw recnum = recpos = 0; 2012494Sdlw cplus = cblank = NO; 2022494Sdlw icptr = a->iciunit; 2032494Sdlw icend = icptr + a->icirlen * a->icirnum; 2042494Sdlw errflag = a->icierr; 2052494Sdlw endflag = a->iciend; 2062494Sdlw leof = NO; 2072494Sdlw return(OK); 2082494Sdlw } 2092494Sdlw 2102494Sdlw s_rsli(a) icilist *a; 2112494Sdlw { 2122494Sdlw reading = YES; 2132494Sdlw lioproc = l_read; 2142494Sdlw getn = z_getc; 2152494Sdlw ungetn = z_ungetc; 2162494Sdlw l_first = YES; 2172494Sdlw lcount = 0; 2182494Sdlw lquit = NO; 2192494Sdlw return(c_li(a)); 2202494Sdlw } 2212494Sdlw 2222494Sdlw s_wsli(a) icilist *a; 2232494Sdlw { 2242494Sdlw reading = NO; 2252494Sdlw putn = z_putc; 2262494Sdlw lioproc = l_write; 2272494Sdlw line_len = a->icirlen; 2282494Sdlw return(c_li(a)); 2292494Sdlw } 2302494Sdlw 2312494Sdlw e_rsli() 2322494Sdlw { fmtbuf = NULL; 2332494Sdlw return(OK); 2342494Sdlw } 2352494Sdlw 2362494Sdlw e_wsli() 2372494Sdlw { fmtbuf = NULL; 2382494Sdlw reclen = recpos; 2392494Sdlw return(z_wnew()); 2402494Sdlw } 2412494Sdlw 2422494Sdlw ftnint 2432494Sdlw iiorec_() 2442494Sdlw { return(recnum); } 2452494Sdlw 2462494Sdlw ftnint 2472494Sdlw iiopos_() 2482494Sdlw { return(recpos); } 249