BSD 4_3 release
[unix-history] / usr / src / usr.lib / libI77 / c_iio.c
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)c_iio.c 5.2 7/30/85
*/
/*
* internal (character array) i/o: common portions
*/
#include "fio.h"
#include "lio.h"
LOCAL icilist *svic; /* active internal io list */
LOCAL lio_nl;
int z_wnew();
z_getc()
{
if(formatted == LISTDIRECTED )
{
if( lio_nl == YES )
{
recnum++;
recpos = 0;
}
else if (recpos == svic->icirlen)
{
lio_nl = YES;
return('\n');
}
lio_nl = NO;
}
if(icptr >= icend && !recpos) /* new rec beyond eof */
{ leof = EOF;
return(EOF);
}
if(recpos++ < svic->icirlen) return(*icptr++);
return(' ');
}
z_putc(c) char c;
{
if(icptr < icend)
{ if(c=='\n') return(z_wnew());
if(recpos++ < svic->icirlen)
{ *icptr++ = c;
return(OK);
}
else err(errflag,F_EREREC,"iio")
}
leof = EOF;
#ifndef KOSHER
err(endflag,EOF,"iio") /* NOT STANDARD, end-of-file on writes */
#endif
#ifdef KOSHER
err(errflag,F_EREREC,"iio")
#endif
}
z_ungetc(ch,cf) char ch;
{
if( lio_nl == YES )
{
lio_nl = NO;
return(OK);
}
if(ch==EOF || --recpos >= svic->icirlen) return(OK);
if(--icptr < svic->iciunit || recpos < 0) err(errflag,F_ERBREC,"ilio")
*icptr = ch;
return(OK);
}
LOCAL
c_fi(a) icilist *a;
{
fmtbuf=a->icifmt;
formatted = FORMATTED;
external = NO;
cblank=cplus=NO;
scale=cursor=0;
radix = 10;
signit = YES;
elist = YES;
svic = a;
recpos=reclen=0;
icend = a->iciunit + a->icirnum*a->icirlen;
errflag = a->icierr;
endflag = a->iciend;
return(OK);
}
c_si(a) icilist *a;
{
sequential = YES;
recnum = 0;
icptr = a->iciunit;
return(c_fi(a));
}
c_di(a) icilist *a;
{
sequential = NO;
recnum = a->icirec - 1;
icptr = a->iciunit + recnum*a->icirlen;
return(c_fi(a));
}
z_rnew()
{
icptr = svic->iciunit + (++recnum)*svic->icirlen;
recpos = reclen = cursor = 0;
return(OK);
}
z_wnew()
{
if(reclen > recpos)
{ icptr += (reclen - recpos);
recpos = reclen;
}
while(recpos < svic->icirlen) (*putn)(' ');
recpos = reclen = cursor = 0;
recnum++;
return(OK);
}
z_tab()
{ int n;
if(reclen < recpos) reclen = recpos;
if((recpos + cursor) < 0) cursor = -recpos; /* to BOR */
n = reclen - recpos;
if(!reading && (cursor-n) > 0)
{ icptr += n;
recpos = reclen;
cursor -= n;
while(cursor--) if(n=(*putn)(' ')) return(n);
}
else
{ icptr += cursor;
recpos += cursor;
}
return(cursor=0);
}
c_li(a) icilist *a;
{
fmtbuf="int list io";
sequential = YES;
formatted = LISTDIRECTED;
external = NO;
elist = YES;
svic = a;
recnum = recpos = 0;
cplus = cblank = NO;
lio_nl = NO;
icptr = a->iciunit;
icend = icptr + a->icirlen * a->icirnum;
errflag = a->icierr;
endflag = a->iciend;
leof = NO;
return(OK);
}