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