xref: /csrg-svn/usr.bin/f77/libI77/iio.c (revision 17968)
12494Sdlw /*
2*17968Slibs char id_iio[] = "@(#)iio.c	1.6";
32494Sdlw  *
42494Sdlw  * internal (character array) i/o
52494Sdlw  */
62494Sdlw 
72494Sdlw #include "fio.h"
82494Sdlw #include "lio.h"
92494Sdlw 
102494Sdlw extern int rd_ed(),rd_ned(),w_ed(),w_ned();
112494Sdlw extern int l_read(),l_write();
122494Sdlw int z_wnew(),z_rnew(),z_tab();
132494Sdlw 
142494Sdlw z_getc()
152494Sdlw {
162494Sdlw 	if(icptr >= icend && !recpos)	/* new rec beyond eof */
172494Sdlw 	{	leof = EOF;
182494Sdlw 		return(EOF);
192494Sdlw 	}
202494Sdlw 	if(recpos++ < svic->icirlen) return(*icptr++);
2117893Sdlw 	if(formatted == LISTDIRECTED) return(EOF);
222494Sdlw 	return(' ');
232494Sdlw }
242494Sdlw 
252494Sdlw z_putc(c) char c;
262494Sdlw {
272494Sdlw 	if(icptr < icend)
282494Sdlw 	{	if(c=='\n') return(z_wnew());
292494Sdlw 		if(recpos++ < svic->icirlen)
302494Sdlw 		{	*icptr++ = c;
312494Sdlw 			return(OK);
322494Sdlw 		}
332593Sdlw 		else err(errflag,F_EREREC,"iio")
342494Sdlw 	}
352494Sdlw 	leof = EOF;
362494Sdlw #ifndef KOSHER
372494Sdlw 	err(endflag,EOF,"iio")   /* NOT STANDARD, end-of-file on writes */
382494Sdlw #endif
392494Sdlw #ifdef KOSHER
402593Sdlw 	err(errflag,F_EREREC,"iio")
412494Sdlw #endif
422494Sdlw }
432494Sdlw 
442494Sdlw z_ungetc(ch,cf) char ch;
452494Sdlw {	if(ch==EOF || --recpos >= svic->icirlen) return(OK);
462593Sdlw 	if(--icptr < svic->iciunit || recpos < 0) err(errflag,F_ERBREC,"ilio")
472494Sdlw 	*icptr = ch;
482494Sdlw 	return(OK);
492494Sdlw }
502494Sdlw 
512494Sdlw s_rsfi(a) icilist *a;
522494Sdlw {
532494Sdlw 	reading = YES;
542494Sdlw 	doed=rd_ed;
552494Sdlw 	doned=rd_ned;
562494Sdlw 	getn=z_getc;
572494Sdlw 	doend = donewrec = z_rnew;
582494Sdlw 	dorevert = z_rnew;
592494Sdlw 	dotab = z_tab;
602494Sdlw 	return(c_si(a));
612494Sdlw }
622494Sdlw 
632494Sdlw s_wsfi(a) icilist *a;
642494Sdlw {
652494Sdlw 	reading = NO;
662494Sdlw 	doed=w_ed;
672494Sdlw 	doned=w_ned;
682494Sdlw 	putn=z_putc;
692494Sdlw 	doend = donewrec = z_wnew;
702494Sdlw 	dorevert = z_wnew;
712494Sdlw 	dotab = z_tab;
722494Sdlw 	return(c_si(a));
732494Sdlw }
742494Sdlw 
752494Sdlw s_rdfi(a) icilist *a;
762494Sdlw {
772494Sdlw 	reading = YES;
782494Sdlw 	doed = rd_ed;
792494Sdlw 	doned = rd_ned;
802494Sdlw 	getn = z_getc;
812494Sdlw 	donewrec = z_rnew;
822494Sdlw 	dorevert = doend = z_rnew;
832494Sdlw 	dotab = z_tab;
842494Sdlw 	return(c_di(a));
852494Sdlw }
862494Sdlw 
872494Sdlw s_wdfi(a) icilist *a;
882494Sdlw {
892494Sdlw 	reading = NO;
902494Sdlw 	doed = w_ed;
912494Sdlw 	doned = w_ned;
922494Sdlw 	putn = z_putc;
932494Sdlw 	donewrec = z_wnew;
942494Sdlw 	dorevert = doend = z_wnew;
952494Sdlw 	dotab = z_tab;
962494Sdlw 	return(c_di(a));
972494Sdlw }
982494Sdlw 
992494Sdlw c_fi(a) icilist *a;
1002494Sdlw {
1012494Sdlw 	fmtbuf=a->icifmt;
1022494Sdlw 	formatted = FORMATTED;
1032494Sdlw 	external = NO;
1042494Sdlw 	cblank=cplus=NO;
1052494Sdlw 	scale=cursor=0;
1062494Sdlw 	radix = 10;
1072494Sdlw 	signit = YES;
1082494Sdlw 	elist = YES;
1092494Sdlw 	svic = a;
1102494Sdlw 	recpos=reclen=0;
1112494Sdlw 	icend = a->iciunit + a->icirnum*a->icirlen;
1122494Sdlw 	errflag = a->icierr;
1132494Sdlw 	endflag = a->iciend;
114*17968Slibs 	if(pars_f()) err(errflag,F_ERFMT,"ifio")
1152494Sdlw 	fmt_bg();
1162494Sdlw 	return(OK);
1172494Sdlw }
1182494Sdlw 
1192494Sdlw c_si(a) icilist *a;
1202494Sdlw {
1212494Sdlw 	sequential = YES;
1222494Sdlw 	recnum = 0;
1232494Sdlw 	icptr = a->iciunit;
1242494Sdlw 	return(c_fi(a));
1252494Sdlw }
1262494Sdlw 
1272494Sdlw c_di(a) icilist *a;
1282494Sdlw {
1292494Sdlw 	sequential = NO;
1302494Sdlw 	recnum = a->icirec - 1;
1312494Sdlw 	icptr = a->iciunit + recnum*a->icirlen;
1322494Sdlw 	return(c_fi(a));
1332494Sdlw }
1342494Sdlw 
1352494Sdlw z_rnew()
1362494Sdlw {
1372494Sdlw 	icptr = svic->iciunit + (++recnum)*svic->icirlen;
1382494Sdlw 	recpos = reclen = cursor = 0;
1392494Sdlw 	return(OK);
1402494Sdlw }
1412494Sdlw 
1422494Sdlw z_wnew()
1432494Sdlw {
1442494Sdlw 	if(reclen > recpos)
1452494Sdlw 	{	icptr += (reclen - recpos);
1462494Sdlw 		recpos = reclen;
1472494Sdlw 	}
1482494Sdlw 	while(recpos < svic->icirlen) (*putn)(' ');
1492494Sdlw 	recpos = reclen = cursor = 0;
1502494Sdlw 	recnum++;
1512494Sdlw 	return(OK);
1522494Sdlw }
1532494Sdlw 
1542494Sdlw z_tab()
1552494Sdlw {	int n;
1562494Sdlw 	if(reclen < recpos) reclen = recpos;
15712048Sdlw 	if((recpos + cursor) < 0) cursor = -recpos;	/* to BOR */
1582494Sdlw 	n = reclen - recpos;
1592494Sdlw 	if(!reading && (cursor-n) > 0)
1602494Sdlw 	{	icptr += n;
1612494Sdlw 		recpos = reclen;
1622494Sdlw 		cursor -= n;
1632494Sdlw 		while(cursor--) if(n=(*putn)(' ')) return(n);
1642494Sdlw 	}
1652494Sdlw 	else
1662494Sdlw 	{	icptr += cursor;
1672494Sdlw 		recpos += cursor;
1682494Sdlw 	}
1692494Sdlw 	return(cursor=0);
1702494Sdlw }
1712494Sdlw 
1722494Sdlw e_rsfi()
1732494Sdlw {	int n;
1742494Sdlw 	n = en_fio();
1752494Sdlw 	fmtbuf = NULL;
1762494Sdlw 	return(n);
1772494Sdlw }
1782494Sdlw 
1792494Sdlw e_wsfi()
1802494Sdlw {
1812494Sdlw 	return(e_rsfi());
1822494Sdlw }
1832494Sdlw 
1842494Sdlw e_rdfi()
1852494Sdlw {
1862494Sdlw 	return(e_rsfi());
1872494Sdlw }
1882494Sdlw 
1892494Sdlw e_wdfi()
1902494Sdlw {
1912494Sdlw 	return(e_wsfi());
1922494Sdlw }
1932494Sdlw 
1942494Sdlw c_li(a) icilist *a;
1952494Sdlw {
1962494Sdlw 	fmtbuf="int list io";
1972494Sdlw 	sequential = formatted = LISTDIRECTED;
1982494Sdlw 	external = NO;
1992494Sdlw 	elist = YES;
2002494Sdlw 	svic = a;
2012494Sdlw 	recnum = recpos = 0;
2022494Sdlw 	cplus = cblank = NO;
2032494Sdlw 	icptr = a->iciunit;
2042494Sdlw 	icend = icptr + a->icirlen * a->icirnum;
2052494Sdlw 	errflag = a->icierr;
2062494Sdlw 	endflag = a->iciend;
2072494Sdlw 	leof = NO;
2082494Sdlw 	return(OK);
2092494Sdlw }
2102494Sdlw 
2112494Sdlw s_rsli(a) icilist *a;
2122494Sdlw {
2132494Sdlw 	reading = YES;
2142494Sdlw 	lioproc = l_read;
2152494Sdlw 	getn = z_getc;
2162494Sdlw 	ungetn = z_ungetc;
2172494Sdlw 	l_first = YES;
2182494Sdlw 	lcount = 0;
2192494Sdlw 	lquit = NO;
2202494Sdlw 	return(c_li(a));
2212494Sdlw }
2222494Sdlw 
2232494Sdlw s_wsli(a) icilist *a;
2242494Sdlw {
2252494Sdlw 	reading = NO;
2262494Sdlw 	putn = z_putc;
2272494Sdlw 	lioproc = l_write;
2282494Sdlw 	line_len = a->icirlen;
2292494Sdlw 	return(c_li(a));
2302494Sdlw }
2312494Sdlw 
2322494Sdlw e_rsli()
2332494Sdlw {	fmtbuf = NULL;
2342494Sdlw 	return(OK);
2352494Sdlw }
2362494Sdlw 
2372494Sdlw e_wsli()
2382494Sdlw {	fmtbuf = NULL;
2392494Sdlw 	reclen = recpos;
2402494Sdlw 	return(z_wnew());
2412494Sdlw }
2422494Sdlw 
2432494Sdlw ftnint
2442494Sdlw iiorec_()
2452494Sdlw {	return(recnum);	}
2462494Sdlw 
2472494Sdlw ftnint
2482494Sdlw iiopos_()
2492494Sdlw {	return(recpos);	}
250