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