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