12501Sdlw /* 2*6605Sdlw char id_sfe[] = "@(#)sfe.c 1.5"; 32501Sdlw * 42501Sdlw * sequential formatted external routines 52501Sdlw */ 62501Sdlw 72501Sdlw #include "fio.h" 82501Sdlw 92501Sdlw /* 102501Sdlw * read sequential formatted external 112501Sdlw */ 122501Sdlw 132501Sdlw extern int rd_ed(),rd_ned(); 142501Sdlw int x_rnew(),x_getc(),x_tab(); 152501Sdlw 164115Sdlw char rsfe[] = "read sfe"; 174115Sdlw char wsfe[] = "write sfe"; 184115Sdlw 192501Sdlw s_rsfe(a) cilist *a; /* start */ 202501Sdlw { int n; 212501Sdlw reading = YES; 222501Sdlw if(n=c_sfe(a,READ)) return(n); 234115Sdlw if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rsfe) 242501Sdlw getn= x_getc; 252501Sdlw doed= rd_ed; 262501Sdlw doned= rd_ned; 272501Sdlw donewrec = dorevert = doend = x_rnew; 282501Sdlw dotab = x_tab; 294115Sdlw if(pars_f(fmtbuf)) err(errflag,F_ERFMT,rsfe) 302501Sdlw fmt_bg(); 312501Sdlw return(OK); 322501Sdlw } 332501Sdlw 342501Sdlw x_rnew() /* find next record */ 352501Sdlw { int ch; 36*6605Sdlw if(curunit->uend) 37*6605Sdlw return(EOF); 38*6605Sdlw while((ch=getc(cf))!='\n' && ch!=EOF); 39*6605Sdlw if(feof(cf)) 404055Sdlw { curunit->uend = YES; 41*6605Sdlw if (recpos==0) return(EOF); 424055Sdlw } 432501Sdlw cursor=recpos=reclen=0; 442501Sdlw return(OK); 452501Sdlw } 462501Sdlw 472501Sdlw x_getc() 482501Sdlw { int ch; 492501Sdlw if(curunit->uend) return(EOF); 502501Sdlw if((ch=getc(cf))!=EOF && ch!='\n') 512501Sdlw { recpos++; 522501Sdlw return(ch); 532501Sdlw } 542501Sdlw if(ch=='\n') 552501Sdlw { ungetc(ch,cf); 562501Sdlw return(ch); 572501Sdlw } 582501Sdlw if(feof(cf)) curunit->uend = YES; 592501Sdlw return(EOF); 602501Sdlw } 612501Sdlw 622501Sdlw e_rsfe() 632501Sdlw { int n; 642501Sdlw n=en_fio(); 652501Sdlw fmtbuf=NULL; 662501Sdlw return(n); 672501Sdlw } 682501Sdlw 692501Sdlw c_sfe(a,flag) cilist *a; /* check */ 702501Sdlw { unit *p; 712501Sdlw int n; 722501Sdlw external=sequential=formatted=FORMATTED; 732501Sdlw fmtbuf=a->cifmt; 742501Sdlw lfname = NULL; 752501Sdlw elist = NO; 762501Sdlw errflag = a->cierr; 772501Sdlw endflag = a->ciend; 782501Sdlw lunit = a->ciunit; 794115Sdlw if(not_legal(lunit)) err(errflag,F_ERUNIT,rsfe+5); 802501Sdlw curunit = p = &units[lunit]; 812501Sdlw if(!p->ufd && (n=fk_open(flag,SEQ,FMT,(ftnint)lunit)) ) 824115Sdlw err(errflag,n,rsfe+5) 832501Sdlw cf = curunit->ufd; 842501Sdlw elist = YES; 852501Sdlw lfname = curunit->ufnm; 864115Sdlw if(!p->ufmt) err(errflag,F_ERNOFIO,rsfe+5) 874115Sdlw if(p->url) err(errflag,F_ERNOSIO,rsfe+5) 882501Sdlw cursor=recpos=scale=reclen=0; 892501Sdlw radix = 10; 902501Sdlw signit = YES; 912501Sdlw cblank = curunit->ublnk; 922501Sdlw cplus = NO; 932501Sdlw return(OK); 942501Sdlw } 952501Sdlw 962501Sdlw /* 972501Sdlw * write sequential formatted external 982501Sdlw */ 992501Sdlw 1002501Sdlw extern int w_ed(),w_ned(); 1012501Sdlw int x_putc(),pr_put(),x_wend(),x_wnew(); 1022501Sdlw ioflag new; 1032501Sdlw 1042501Sdlw s_wsfe(a) cilist *a; /*start*/ 1052501Sdlw { int n; 1062501Sdlw reading = NO; 1072501Sdlw if(n=c_sfe(a,WRITE)) return(n); 1084115Sdlw if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsfe) 1092501Sdlw curunit->uend = NO; 1102501Sdlw if (curunit->uprnt) putn = pr_put; 1112501Sdlw else putn = x_putc; 1122501Sdlw new = YES; 1132501Sdlw doed= w_ed; 1142501Sdlw doned= w_ned; 1152501Sdlw doend = x_wend; 1162501Sdlw dorevert = donewrec = x_wnew; 1172501Sdlw dotab = x_tab; 1184115Sdlw if(pars_f(fmtbuf)) err(errflag,F_ERFMT,wsfe) 1192501Sdlw fmt_bg(); 1202501Sdlw return(OK); 1212501Sdlw } 1222501Sdlw 1232501Sdlw x_putc(c) 1242501Sdlw { 1252501Sdlw if(c=='\n') recpos = reclen = cursor = 0; 1262501Sdlw else recpos++; 1272501Sdlw if (c) putc(c,cf); 1282501Sdlw return(OK); 1292501Sdlw } 1302501Sdlw 1312501Sdlw pr_put(c) 1322501Sdlw { 1332501Sdlw if(c=='\n') 1342501Sdlw { new = YES; 1352501Sdlw recpos = reclen = cursor = 0; 1362501Sdlw } 1372501Sdlw else if(new) 1382501Sdlw { new = NO; 1392501Sdlw if(c=='0') c = '\n'; 1402501Sdlw else if(c=='1') c = '\f'; 1412501Sdlw else return(OK); 1422501Sdlw } 1432501Sdlw else recpos++; 1442501Sdlw if (c) putc(c,cf); 1452501Sdlw return(OK); 1462501Sdlw } 1472501Sdlw 1482501Sdlw x_tab() 1492501Sdlw { int n; 1502501Sdlw if(reclen < recpos) reclen = recpos; 1512501Sdlw if(curunit->useek) 1522600Sdlw { if((recpos+cursor) < 0) return(F_ERBREC); 1532501Sdlw n = reclen - recpos; /* distance to eor, n>=0 */ 1542501Sdlw if((cursor-n) > 0) 1552501Sdlw { fseek(cf,(long)n,1); /* find current eor */ 1562501Sdlw recpos = reclen; 1572501Sdlw cursor -= n; 1582501Sdlw } 1592501Sdlw else 1602501Sdlw { fseek(cf,(long)cursor,1); /* do not pass go */ 1612501Sdlw recpos += cursor; 1622501Sdlw return(cursor=0); 1632501Sdlw } 1642501Sdlw } 1652501Sdlw else 1662600Sdlw if(cursor < 0) return(F_ERSEEK); /* can't go back */ 1672501Sdlw while(cursor--) 1682501Sdlw { if(reading) 1692501Sdlw { n = (*getn)(); 1702501Sdlw if(n=='\n') 1712501Sdlw { (*ungetn)(n,cf); 1722600Sdlw return(F_EREREC); 1732501Sdlw } 1742501Sdlw if(n==EOF) return(EOF); 1752501Sdlw } 1762501Sdlw else (*putn)(' '); /* fill in the empty record */ 1772501Sdlw } 1782501Sdlw return(cursor=0); 1792501Sdlw } 1802501Sdlw 1812501Sdlw x_wnew() 1822501Sdlw { 1832501Sdlw if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1); 1842501Sdlw return((*putn)('\n')); 1852501Sdlw } 1862501Sdlw 1872501Sdlw x_wend(last) char last; 1882501Sdlw { 1892501Sdlw if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1); 1902501Sdlw return((*putn)(last)); 1912501Sdlw } 1922501Sdlw 1932501Sdlw /* 1942501Sdlw /*xw_rev() 1952501Sdlw /*{ 1962501Sdlw /* if(workdone) x_wSL(); 1972501Sdlw /* return(workdone=0); 1982501Sdlw /*} 1992501Sdlw /* 2002501Sdlw */ 2012501Sdlw e_wsfe() 2022501Sdlw { return(e_rsfe()); } 203