xref: /csrg-svn/usr.bin/f77/libI77/c_iio.c (revision 47943)
1*47943Sbostic /*-
2*47943Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic  * All rights reserved.
420995Slibs  *
5*47943Sbostic  * %sccs.include.proprietary.c%
623065Skre  */
723065Skre 
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)c_iio.c	5.3 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic 
1223065Skre /*
1320995Slibs  * internal (character array) i/o: common portions
1420995Slibs  */
1520995Slibs 
1620995Slibs #include "fio.h"
1720995Slibs #include "lio.h"
1820995Slibs 
1920995Slibs LOCAL icilist *svic;		/* active internal io list */
2021011Slibs LOCAL lio_nl;
2120995Slibs 
2220995Slibs int z_wnew();
2320995Slibs 
z_getc()2420995Slibs z_getc()
2520995Slibs {
2621011Slibs 	if(formatted == LISTDIRECTED )
2721011Slibs 	{
2821011Slibs 		if( lio_nl == YES )
2921011Slibs 		{
3021011Slibs 			recnum++;
3121011Slibs 			recpos = 0;
3221011Slibs 		}
3321011Slibs 		else if (recpos == svic->icirlen)
3421011Slibs 		{
3521011Slibs 			lio_nl = YES;
3621011Slibs 			return('\n');
3721011Slibs 		}
3821011Slibs 		lio_nl = NO;
3921011Slibs 	}
4021011Slibs 
4120995Slibs 	if(icptr >= icend && !recpos)	/* new rec beyond eof */
4220995Slibs 	{	leof = EOF;
4320995Slibs 		return(EOF);
4420995Slibs 	}
4520995Slibs 	if(recpos++ < svic->icirlen) return(*icptr++);
4620995Slibs 	return(' ');
4720995Slibs }
4820995Slibs 
z_putc(c)4920995Slibs z_putc(c) char c;
5020995Slibs {
5120995Slibs 	if(icptr < icend)
5220995Slibs 	{	if(c=='\n') return(z_wnew());
5320995Slibs 		if(recpos++ < svic->icirlen)
5420995Slibs 		{	*icptr++ = c;
5520995Slibs 			return(OK);
5620995Slibs 		}
5720995Slibs 		else err(errflag,F_EREREC,"iio")
5820995Slibs 	}
5920995Slibs 	leof = EOF;
6020995Slibs #ifndef KOSHER
6120995Slibs 	err(endflag,EOF,"iio")   /* NOT STANDARD, end-of-file on writes */
6220995Slibs #endif
6320995Slibs #ifdef KOSHER
6420995Slibs 	err(errflag,F_EREREC,"iio")
6520995Slibs #endif
6620995Slibs }
6720995Slibs 
z_ungetc(ch,cf)6820995Slibs z_ungetc(ch,cf) char ch;
6921011Slibs {
7021011Slibs 	if( lio_nl == YES )
7121011Slibs 	{
7221011Slibs 		lio_nl = NO;
7321011Slibs 		return(OK);
7421011Slibs 	}
7521011Slibs 	if(ch==EOF || --recpos >= svic->icirlen) return(OK);
7620995Slibs 	if(--icptr < svic->iciunit || recpos < 0) err(errflag,F_ERBREC,"ilio")
7720995Slibs 	*icptr = ch;
7820995Slibs 	return(OK);
7920995Slibs }
8020995Slibs 
8120995Slibs LOCAL
c_fi(a)8220995Slibs c_fi(a) icilist *a;
8320995Slibs {
8420995Slibs 	fmtbuf=a->icifmt;
8520995Slibs 	formatted = FORMATTED;
8620995Slibs 	external = NO;
8720995Slibs 	cblank=cplus=NO;
8820995Slibs 	scale=cursor=0;
8920995Slibs 	radix = 10;
9020995Slibs 	signit = YES;
9120995Slibs 	elist = YES;
9220995Slibs 	svic = a;
9320995Slibs 	recpos=reclen=0;
9420995Slibs 	icend = a->iciunit + a->icirnum*a->icirlen;
9520995Slibs 	errflag = a->icierr;
9620995Slibs 	endflag = a->iciend;
9720995Slibs 	return(OK);
9820995Slibs }
9920995Slibs 
c_si(a)10020995Slibs c_si(a) icilist *a;
10120995Slibs {
10220995Slibs 	sequential = YES;
10320995Slibs 	recnum = 0;
10420995Slibs 	icptr = a->iciunit;
10520995Slibs 	return(c_fi(a));
10620995Slibs }
10720995Slibs 
c_di(a)10820995Slibs c_di(a) icilist *a;
10920995Slibs {
11020995Slibs 	sequential = NO;
11120995Slibs 	recnum = a->icirec - 1;
11220995Slibs 	icptr = a->iciunit + recnum*a->icirlen;
11320995Slibs 	return(c_fi(a));
11420995Slibs }
11520995Slibs 
z_rnew()11620995Slibs z_rnew()
11720995Slibs {
11820995Slibs 	icptr = svic->iciunit + (++recnum)*svic->icirlen;
11920995Slibs 	recpos = reclen = cursor = 0;
12020995Slibs 	return(OK);
12120995Slibs }
12220995Slibs 
z_wnew()12320995Slibs z_wnew()
12420995Slibs {
12520995Slibs 	if(reclen > recpos)
12620995Slibs 	{	icptr += (reclen - recpos);
12720995Slibs 		recpos = reclen;
12820995Slibs 	}
12920995Slibs 	while(recpos < svic->icirlen) (*putn)(' ');
13020995Slibs 	recpos = reclen = cursor = 0;
13120995Slibs 	recnum++;
13220995Slibs 	return(OK);
13320995Slibs }
13420995Slibs 
z_tab()13520995Slibs z_tab()
13620995Slibs {	int n;
13720995Slibs 	if(reclen < recpos) reclen = recpos;
13820995Slibs 	if((recpos + cursor) < 0) cursor = -recpos;	/* to BOR */
13920995Slibs 	n = reclen - recpos;
14020995Slibs 	if(!reading && (cursor-n) > 0)
14120995Slibs 	{	icptr += n;
14220995Slibs 		recpos = reclen;
14320995Slibs 		cursor -= n;
14420995Slibs 		while(cursor--) if(n=(*putn)(' ')) return(n);
14520995Slibs 	}
14620995Slibs 	else
14720995Slibs 	{	icptr += cursor;
14820995Slibs 		recpos += cursor;
14920995Slibs 	}
15020995Slibs 	return(cursor=0);
15120995Slibs }
15220995Slibs 
c_li(a)15320995Slibs c_li(a) icilist *a;
15420995Slibs {
15520995Slibs 	fmtbuf="int list io";
15624097Sjerry 	sequential = YES;
15724097Sjerry 	formatted = LISTDIRECTED;
15820995Slibs 	external = NO;
15920995Slibs 	elist = YES;
16020995Slibs 	svic = a;
16120995Slibs 	recnum = recpos = 0;
16220995Slibs 	cplus = cblank = NO;
16321011Slibs 	lio_nl = NO;
16420995Slibs 	icptr = a->iciunit;
16520995Slibs 	icend = icptr + a->icirlen * a->icirnum;
16620995Slibs 	errflag = a->icierr;
16720995Slibs 	endflag = a->iciend;
16820995Slibs 	leof = NO;
16920995Slibs 	return(OK);
17020995Slibs }
171