/* char id_iio[] = "@(#)iio.c 1.2"; * * internal (character array) i/o */ #include "fio.h" #include "lio.h" extern int rd_ed(),rd_ned(),w_ed(),w_ned(); extern int l_read(),l_write(); int z_wnew(),z_rnew(),z_tab(); z_getc() { if(icptr >= icend && !recpos) /* new rec beyond eof */ { leof = EOF; return(EOF); } if(recpos++ < svic->icirlen) return(*icptr++); return(' '); } z_putc(c) char c; { if(icptr < icend) { if(c=='\n') return(z_wnew()); if(recpos++ < svic->icirlen) { *icptr++ = c; return(OK); } else err(errflag,F_EREREC,"iio") } leof = EOF; #ifndef KOSHER err(endflag,EOF,"iio") /* NOT STANDARD, end-of-file on writes */ #endif #ifdef KOSHER err(errflag,F_EREREC,"iio") #endif } z_ungetc(ch,cf) char ch; { if(ch==EOF || --recpos >= svic->icirlen) return(OK); if(--icptr < svic->iciunit || recpos < 0) err(errflag,F_ERBREC,"ilio") *icptr = ch; return(OK); } s_rsfi(a) icilist *a; { reading = YES; doed=rd_ed; doned=rd_ned; getn=z_getc; doend = donewrec = z_rnew; dorevert = z_rnew; dotab = z_tab; return(c_si(a)); } s_wsfi(a) icilist *a; { reading = NO; doed=w_ed; doned=w_ned; putn=z_putc; doend = donewrec = z_wnew; dorevert = z_wnew; dotab = z_tab; return(c_si(a)); } s_rdfi(a) icilist *a; { reading = YES; doed = rd_ed; doned = rd_ned; getn = z_getc; donewrec = z_rnew; dorevert = doend = z_rnew; dotab = z_tab; return(c_di(a)); } s_wdfi(a) icilist *a; { reading = NO; doed = w_ed; doned = w_ned; putn = z_putc; donewrec = z_wnew; dorevert = doend = z_wnew; dotab = z_tab; return(c_di(a)); } c_fi(a) icilist *a; { fmtbuf=a->icifmt; formatted = FORMATTED; external = NO; cblank=cplus=NO; scale=cursor=0; radix = 10; signit = YES; elist = YES; svic = a; recpos=reclen=0; icend = a->iciunit + a->icirnum*a->icirlen; errflag = a->icierr; endflag = a->iciend; if(pars_f(fmtbuf)) err(errflag,F_ERFMT,"ifio") fmt_bg(); return(OK); } c_si(a) icilist *a; { sequential = YES; recnum = 0; icptr = a->iciunit; return(c_fi(a)); } c_di(a) icilist *a; { sequential = NO; recnum = a->icirec - 1; icptr = a->iciunit + recnum*a->icirlen; return(c_fi(a)); } z_rnew() { icptr = svic->iciunit + (++recnum)*svic->icirlen; recpos = reclen = cursor = 0; return(OK); } z_wnew() { if(reclen > recpos) { icptr += (reclen - recpos); recpos = reclen; } while(recpos < svic->icirlen) (*putn)(' '); recpos = reclen = cursor = 0; recnum++; return(OK); } z_tab() { int n; if(reclen < recpos) reclen = recpos; if((recpos + cursor) < 0) return(F_ERBREC); n = reclen - recpos; if(!reading && (cursor-n) > 0) { icptr += n; recpos = reclen; cursor -= n; while(cursor--) if(n=(*putn)(' ')) return(n); } else { icptr += cursor; recpos += cursor; } return(cursor=0); } e_rsfi() { int n; n = en_fio(); fmtbuf = NULL; return(n); } e_wsfi() { return(e_rsfi()); } e_rdfi() { return(e_rsfi()); } e_wdfi() { return(e_wsfi()); } c_li(a) icilist *a; { fmtbuf="int list io"; sequential = formatted = LISTDIRECTED; external = NO; elist = YES; svic = a; recnum = recpos = 0; cplus = cblank = NO; icptr = a->iciunit; icend = icptr + a->icirlen * a->icirnum; errflag = a->icierr; endflag = a->iciend; leof = NO; return(OK); } s_rsli(a) icilist *a; { reading = YES; lioproc = l_read; getn = z_getc; ungetn = z_ungetc; l_first = YES; lcount = 0; lquit = NO; return(c_li(a)); } s_wsli(a) icilist *a; { reading = NO; putn = z_putc; lioproc = l_write; line_len = a->icirlen; return(c_li(a)); } e_rsli() { fmtbuf = NULL; return(OK); } e_wsli() { fmtbuf = NULL; reclen = recpos; return(z_wnew()); } ftnint iiorec_() { return(recnum); } ftnint iiopos_() { return(recpos); }