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