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