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