12501Sdlw /* 2*4115Sdlw char id_sfe[] = "@(#)sfe.c 1.4"; 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 16*4115Sdlw char rsfe[] = "read sfe"; 17*4115Sdlw char wsfe[] = "write sfe"; 18*4115Sdlw 192501Sdlw s_rsfe(a) cilist *a; /* start */ 202501Sdlw { int n; 212501Sdlw reading = YES; 222501Sdlw if(n=c_sfe(a,READ)) return(n); 23*4115Sdlw 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; 29*4115Sdlw 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; 362501Sdlw if(!curunit->uend) 372501Sdlw while((ch=getc(cf))!='\n' && ch!=EOF); 384055Sdlw if(recpos==0 && feof(cf)) 394055Sdlw { curunit->uend = YES; 404055Sdlw return(EOF); 414055Sdlw } 422501Sdlw cursor=recpos=reclen=0; 432501Sdlw return(OK); 442501Sdlw } 452501Sdlw 462501Sdlw x_getc() 472501Sdlw { int ch; 482501Sdlw if(curunit->uend) return(EOF); 492501Sdlw if((ch=getc(cf))!=EOF && ch!='\n') 502501Sdlw { recpos++; 512501Sdlw return(ch); 522501Sdlw } 532501Sdlw if(ch=='\n') 542501Sdlw { ungetc(ch,cf); 552501Sdlw return(ch); 562501Sdlw } 572501Sdlw if(feof(cf)) curunit->uend = YES; 582501Sdlw return(EOF); 592501Sdlw } 602501Sdlw 612501Sdlw e_rsfe() 622501Sdlw { int n; 632501Sdlw n=en_fio(); 642501Sdlw fmtbuf=NULL; 652501Sdlw return(n); 662501Sdlw } 672501Sdlw 682501Sdlw c_sfe(a,flag) cilist *a; /* check */ 692501Sdlw { unit *p; 702501Sdlw int n; 712501Sdlw external=sequential=formatted=FORMATTED; 722501Sdlw fmtbuf=a->cifmt; 732501Sdlw lfname = NULL; 742501Sdlw elist = NO; 752501Sdlw errflag = a->cierr; 762501Sdlw endflag = a->ciend; 772501Sdlw lunit = a->ciunit; 78*4115Sdlw if(not_legal(lunit)) err(errflag,F_ERUNIT,rsfe+5); 792501Sdlw curunit = p = &units[lunit]; 802501Sdlw if(!p->ufd && (n=fk_open(flag,SEQ,FMT,(ftnint)lunit)) ) 81*4115Sdlw err(errflag,n,rsfe+5) 822501Sdlw cf = curunit->ufd; 832501Sdlw elist = YES; 842501Sdlw lfname = curunit->ufnm; 85*4115Sdlw if(!p->ufmt) err(errflag,F_ERNOFIO,rsfe+5) 86*4115Sdlw if(p->url) err(errflag,F_ERNOSIO,rsfe+5) 872501Sdlw cursor=recpos=scale=reclen=0; 882501Sdlw radix = 10; 892501Sdlw signit = YES; 902501Sdlw cblank = curunit->ublnk; 912501Sdlw cplus = NO; 922501Sdlw return(OK); 932501Sdlw } 942501Sdlw 952501Sdlw /* 962501Sdlw * write sequential formatted external 972501Sdlw */ 982501Sdlw 992501Sdlw extern int w_ed(),w_ned(); 1002501Sdlw int x_putc(),pr_put(),x_wend(),x_wnew(); 1012501Sdlw ioflag new; 1022501Sdlw 1032501Sdlw s_wsfe(a) cilist *a; /*start*/ 1042501Sdlw { int n; 1052501Sdlw reading = NO; 1062501Sdlw if(n=c_sfe(a,WRITE)) return(n); 107*4115Sdlw if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsfe) 1082501Sdlw curunit->uend = NO; 1092501Sdlw if (curunit->uprnt) putn = pr_put; 1102501Sdlw else putn = x_putc; 1112501Sdlw new = YES; 1122501Sdlw doed= w_ed; 1132501Sdlw doned= w_ned; 1142501Sdlw doend = x_wend; 1152501Sdlw dorevert = donewrec = x_wnew; 1162501Sdlw dotab = x_tab; 117*4115Sdlw if(pars_f(fmtbuf)) err(errflag,F_ERFMT,wsfe) 1182501Sdlw fmt_bg(); 1192501Sdlw return(OK); 1202501Sdlw } 1212501Sdlw 1222501Sdlw x_putc(c) 1232501Sdlw { 1242501Sdlw if(c=='\n') recpos = reclen = cursor = 0; 1252501Sdlw else recpos++; 1262501Sdlw if (c) putc(c,cf); 1272501Sdlw return(OK); 1282501Sdlw } 1292501Sdlw 1302501Sdlw pr_put(c) 1312501Sdlw { 1322501Sdlw if(c=='\n') 1332501Sdlw { new = YES; 1342501Sdlw recpos = reclen = cursor = 0; 1352501Sdlw } 1362501Sdlw else if(new) 1372501Sdlw { new = NO; 1382501Sdlw if(c=='0') c = '\n'; 1392501Sdlw else if(c=='1') c = '\f'; 1402501Sdlw else return(OK); 1412501Sdlw } 1422501Sdlw else recpos++; 1432501Sdlw if (c) putc(c,cf); 1442501Sdlw return(OK); 1452501Sdlw } 1462501Sdlw 1472501Sdlw x_tab() 1482501Sdlw { int n; 1492501Sdlw if(reclen < recpos) reclen = recpos; 1502501Sdlw if(curunit->useek) 1512600Sdlw { if((recpos+cursor) < 0) return(F_ERBREC); 1522501Sdlw n = reclen - recpos; /* distance to eor, n>=0 */ 1532501Sdlw if((cursor-n) > 0) 1542501Sdlw { fseek(cf,(long)n,1); /* find current eor */ 1552501Sdlw recpos = reclen; 1562501Sdlw cursor -= n; 1572501Sdlw } 1582501Sdlw else 1592501Sdlw { fseek(cf,(long)cursor,1); /* do not pass go */ 1602501Sdlw recpos += cursor; 1612501Sdlw return(cursor=0); 1622501Sdlw } 1632501Sdlw } 1642501Sdlw else 1652600Sdlw if(cursor < 0) return(F_ERSEEK); /* can't go back */ 1662501Sdlw while(cursor--) 1672501Sdlw { if(reading) 1682501Sdlw { n = (*getn)(); 1692501Sdlw if(n=='\n') 1702501Sdlw { (*ungetn)(n,cf); 1712600Sdlw return(F_EREREC); 1722501Sdlw } 1732501Sdlw if(n==EOF) return(EOF); 1742501Sdlw } 1752501Sdlw else (*putn)(' '); /* fill in the empty record */ 1762501Sdlw } 1772501Sdlw return(cursor=0); 1782501Sdlw } 1792501Sdlw 1802501Sdlw x_wnew() 1812501Sdlw { 1822501Sdlw if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1); 1832501Sdlw return((*putn)('\n')); 1842501Sdlw } 1852501Sdlw 1862501Sdlw x_wend(last) char last; 1872501Sdlw { 1882501Sdlw if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1); 1892501Sdlw return((*putn)(last)); 1902501Sdlw } 1912501Sdlw 1922501Sdlw /* 1932501Sdlw /*xw_rev() 1942501Sdlw /*{ 1952501Sdlw /* if(workdone) x_wSL(); 1962501Sdlw /* return(workdone=0); 1972501Sdlw /*} 1982501Sdlw /* 1992501Sdlw */ 2002501Sdlw e_wsfe() 2012501Sdlw { return(e_rsfe()); } 202