xref: /csrg-svn/usr.bin/f77/libI77/sfe.c (revision 17969)
12501Sdlw /*
2*17969Slibs char id_sfe[] = "@(#)sfe.c	1.9";
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;
29*17969Slibs 	if(pars_f()) err(errflag,F_ERFMT,rsfe)
302501Sdlw 	fmt_bg();
312501Sdlw 	return(OK);
322501Sdlw }
332501Sdlw 
342501Sdlw x_rnew()			/* find next record */
352501Sdlw {	int ch;
366605Sdlw 	if(curunit->uend)
376605Sdlw 		return(EOF);
386605Sdlw 	while((ch=getc(cf))!='\n' && ch!=EOF);
396605Sdlw 	if(feof(cf))
404055Sdlw 	{	curunit->uend = YES;
416605Sdlw 		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;
118*17969Slibs 	if(pars_f()) 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)
15212042Sdlw 	{	if((recpos+cursor) < 0) cursor = -recpos;	/* to BOR */
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)();
17015328Sdlw 			if(n=='\n') return(cursor=0);	/* be tolerant */
1712501Sdlw 			if(n==EOF) return(EOF);
1722501Sdlw 		}
1732501Sdlw 		else	(*putn)(' ');	/* fill in the empty record */
1742501Sdlw 	}
1752501Sdlw 	return(cursor=0);
1762501Sdlw }
1772501Sdlw 
1782501Sdlw x_wnew()
1792501Sdlw {
1802501Sdlw 	if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
1812501Sdlw 	return((*putn)('\n'));
1822501Sdlw }
1832501Sdlw 
1842501Sdlw x_wend(last) char last;
1852501Sdlw {
1862501Sdlw 	if(reclen>recpos) fseek(cf,(long)(reclen-recpos),1);
1872501Sdlw 	return((*putn)(last));
1882501Sdlw }
1892501Sdlw 
1902501Sdlw /*
1912501Sdlw /*xw_rev()
1922501Sdlw /*{
1932501Sdlw /*	if(workdone) x_wSL();
1942501Sdlw /*	return(workdone=0);
1952501Sdlw /*}
1962501Sdlw /*
1972501Sdlw */
1982501Sdlw e_wsfe()
1992501Sdlw {	return(e_rsfe()); }
200