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