12501Sdlw /*
2*20984Slibs char id_sfe[] = "@(#)sfe.c 1.10";
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*20984Slibs LOCAL char rsfe[] = "read sfe";
17*20984Slibs LOCAL char wsfe[] = "write sfe";
184115Sdlw
s_rsfe(a)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;
2917969Slibs if(pars_f()) err(errflag,F_ERFMT,rsfe)
302501Sdlw fmt_bg();
312501Sdlw return(OK);
322501Sdlw }
332501Sdlw
34*20984Slibs LOCAL
x_rnew()352501Sdlw x_rnew() /* find next record */
362501Sdlw { int ch;
376605Sdlw if(curunit->uend)
386605Sdlw return(EOF);
396605Sdlw while((ch=getc(cf))!='\n' && ch!=EOF);
406605Sdlw if(feof(cf))
414055Sdlw { curunit->uend = YES;
426605Sdlw if (recpos==0) return(EOF);
434055Sdlw }
442501Sdlw cursor=recpos=reclen=0;
452501Sdlw return(OK);
462501Sdlw }
472501Sdlw
48*20984Slibs LOCAL
x_getc()492501Sdlw x_getc()
502501Sdlw { int ch;
512501Sdlw if(curunit->uend) return(EOF);
522501Sdlw if((ch=getc(cf))!=EOF && ch!='\n')
532501Sdlw { recpos++;
542501Sdlw return(ch);
552501Sdlw }
562501Sdlw if(ch=='\n')
572501Sdlw { ungetc(ch,cf);
582501Sdlw return(ch);
592501Sdlw }
602501Sdlw if(feof(cf)) curunit->uend = YES;
612501Sdlw return(EOF);
622501Sdlw }
632501Sdlw
e_rsfe()642501Sdlw e_rsfe()
652501Sdlw { int n;
662501Sdlw n=en_fio();
672501Sdlw fmtbuf=NULL;
682501Sdlw return(n);
692501Sdlw }
702501Sdlw
71*20984Slibs LOCAL
c_sfe(a,flag)722501Sdlw c_sfe(a,flag) cilist *a; /* check */
732501Sdlw { unit *p;
742501Sdlw int n;
752501Sdlw external=sequential=formatted=FORMATTED;
762501Sdlw fmtbuf=a->cifmt;
772501Sdlw lfname = NULL;
782501Sdlw elist = NO;
792501Sdlw errflag = a->cierr;
802501Sdlw endflag = a->ciend;
812501Sdlw lunit = a->ciunit;
824115Sdlw if(not_legal(lunit)) err(errflag,F_ERUNIT,rsfe+5);
832501Sdlw curunit = p = &units[lunit];
842501Sdlw if(!p->ufd && (n=fk_open(flag,SEQ,FMT,(ftnint)lunit)) )
854115Sdlw err(errflag,n,rsfe+5)
862501Sdlw cf = curunit->ufd;
872501Sdlw elist = YES;
882501Sdlw lfname = curunit->ufnm;
894115Sdlw if(!p->ufmt) err(errflag,F_ERNOFIO,rsfe+5)
904115Sdlw if(p->url) err(errflag,F_ERNOSIO,rsfe+5)
912501Sdlw cursor=recpos=scale=reclen=0;
922501Sdlw radix = 10;
932501Sdlw signit = YES;
942501Sdlw cblank = curunit->ublnk;
952501Sdlw cplus = NO;
962501Sdlw return(OK);
972501Sdlw }
982501Sdlw
992501Sdlw /*
1002501Sdlw * write sequential formatted external
1012501Sdlw */
1022501Sdlw
1032501Sdlw extern int w_ed(),w_ned();
1042501Sdlw int x_putc(),pr_put(),x_wend(),x_wnew();
105*20984Slibs LOCAL ioflag new;
1062501Sdlw
s_wsfe(a)1072501Sdlw s_wsfe(a) cilist *a; /*start*/
1082501Sdlw { int n;
1092501Sdlw reading = NO;
1102501Sdlw if(n=c_sfe(a,WRITE)) return(n);
1114115Sdlw if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsfe)
1122501Sdlw curunit->uend = NO;
1132501Sdlw if (curunit->uprnt) putn = pr_put;
1142501Sdlw else putn = x_putc;
1152501Sdlw new = YES;
1162501Sdlw doed= w_ed;
1172501Sdlw doned= w_ned;
1182501Sdlw doend = x_wend;
1192501Sdlw dorevert = donewrec = x_wnew;
1202501Sdlw dotab = x_tab;
12117969Slibs if(pars_f()) err(errflag,F_ERFMT,wsfe)
1222501Sdlw fmt_bg();
1232501Sdlw return(OK);
1242501Sdlw }
1252501Sdlw
126*20984Slibs LOCAL
x_putc(c)1272501Sdlw x_putc(c)
1282501Sdlw {
1292501Sdlw if(c=='\n') recpos = reclen = cursor = 0;
1302501Sdlw else recpos++;
1312501Sdlw if (c) putc(c,cf);
1322501Sdlw return(OK);
1332501Sdlw }
1342501Sdlw
135*20984Slibs LOCAL
pr_put(c)1362501Sdlw pr_put(c)
1372501Sdlw {
1382501Sdlw if(c=='\n')
1392501Sdlw { new = YES;
1402501Sdlw recpos = reclen = cursor = 0;
1412501Sdlw }
1422501Sdlw else if(new)
1432501Sdlw { new = NO;
1442501Sdlw if(c=='0') c = '\n';
1452501Sdlw else if(c=='1') c = '\f';
1462501Sdlw else return(OK);
1472501Sdlw }
1482501Sdlw else recpos++;
1492501Sdlw if (c) putc(c,cf);
1502501Sdlw return(OK);
1512501Sdlw }
1522501Sdlw
153*20984Slibs LOCAL
x_tab()1542501Sdlw x_tab()
1552501Sdlw { int n;
1562501Sdlw if(reclen < recpos) reclen = recpos;
1572501Sdlw if(curunit->useek)
15812042Sdlw { if((recpos+cursor) < 0) cursor = -recpos; /* to BOR */
1592501Sdlw n = reclen - recpos; /* distance to eor, n>=0 */
1602501Sdlw if((cursor-n) > 0)
1612501Sdlw { fseek(cf,(long)n,1); /* find current eor */
1622501Sdlw recpos = reclen;
1632501Sdlw cursor -= n;
1642501Sdlw }
1652501Sdlw else
1662501Sdlw { fseek(cf,(long)cursor,1); /* do not pass go */
1672501Sdlw recpos += cursor;
1682501Sdlw return(cursor=0);
1692501Sdlw }
1702501Sdlw }
1712501Sdlw else
1722600Sdlw if(cursor < 0) return(F_ERSEEK); /* can't go back */
1732501Sdlw while(cursor--)
1742501Sdlw { if(reading)
1752501Sdlw { n = (*getn)();
17615328Sdlw if(n=='\n') return(cursor=0); /* be tolerant */
1772501Sdlw if(n==EOF) return(EOF);
1782501Sdlw }
1792501Sdlw else (*putn)(' '); /* fill in the empty record */
1802501Sdlw }
1812501Sdlw return(cursor=0);
1822501Sdlw }
1832501Sdlw
184*20984Slibs LOCAL
x_wnew()1852501Sdlw x_wnew()
1862501Sdlw {
1872501Sdlw if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
1882501Sdlw return((*putn)('\n'));
1892501Sdlw }
1902501Sdlw
191*20984Slibs LOCAL
x_wend(last)1922501Sdlw x_wend(last) char last;
1932501Sdlw {
1942501Sdlw if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
1952501Sdlw return((*putn)(last));
1962501Sdlw }
1972501Sdlw
1982501Sdlw /*
1992501Sdlw /*xw_rev()
2002501Sdlw /*{
2012501Sdlw /* if(workdone) x_wSL();
2022501Sdlw /* return(workdone=0);
2032501Sdlw /*}
2042501Sdlw /*
2052501Sdlw */
e_wsfe()2062501Sdlw e_wsfe()
2072501Sdlw { return(e_rsfe()); }
208