xref: /csrg-svn/usr.bin/f77/libI77/sfe.c (revision 20984)
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