#include "f2c.h"
#include "fio.h"
#include "fmt.h"
extern char *f__icptr;
char *f__icend;
extern icilist *f__svic;
int f__icnum;
extern int f__hiwater;
int
z_getc (void)
{
  if (f__recpos++ < f__svic->icirlen)
    {
      if (f__icptr >= f__icend)
	err (f__svic->iciend, (EOF), "endfile");
      return (*(unsigned char *) f__icptr++);
    }
  return '\n';
}

void
z_putc (int c)
{
  if (f__recpos++ < f__svic->icirlen && f__icptr < f__icend)
    *f__icptr++ = c;
}
int
z_rnew (void)
{
  f__icptr = f__svic->iciunit + (++f__icnum) * f__svic->icirlen;
  f__recpos = 0;
  f__cursor = 0;
  f__hiwater = 0;
  return 1;
}

static int
z_endp (void)
{
  (*f__donewrec) ();
  return 0;
}

int
c_si (icilist * a)
{
  if (f__init & 2)
    f__fatal (131, "I/O recursion");
  f__init |= 2;
  f__elist = (cilist *) a;
  f__fmtbuf = a->icifmt;
  f__curunit = 0;
  f__sequential = f__formatted = 1;
  f__external = 0;
  if (pars_f (f__fmtbuf) < 0)
    err (a->icierr, 100, "startint");
  fmt_bg ();
  f__cblank = f__cplus = f__scale = 0;
  f__svic = a;
  f__icnum = f__recpos = 0;
  f__cursor = 0;
  f__hiwater = 0;
  f__icptr = a->iciunit;
  f__icend = f__icptr + a->icirlen * a->icirnum;
  f__cf = 0;
  return (0);
}

int
iw_rev (void)
{
  if (f__workdone)
    z_endp ();
  f__hiwater = f__recpos = f__cursor = 0;
  return (f__workdone = 0);
}

integer
s_rsfi (icilist * a)
{
  int n;
  if ((n = c_si (a)))
    return (n);
  f__reading = 1;
  f__doed = rd_ed;
  f__doned = rd_ned;
  f__getn = z_getc;
  f__dorevert = z_endp;
  f__donewrec = z_rnew;
  f__doend = z_endp;
  return (0);
}

int
z_wnew (void)
{
  if (f__recpos < f__hiwater)
    {
      f__icptr += f__hiwater - f__recpos;
      f__recpos = f__hiwater;
    }
  while (f__recpos++ < f__svic->icirlen)
    *f__icptr++ = ' ';
  f__recpos = 0;
  f__cursor = 0;
  f__hiwater = 0;
  f__icnum++;
  return 1;
}

integer
s_wsfi (icilist * a)
{
  int n;
  if ((n = c_si (a)))
    return (n);
  f__reading = 0;
  f__doed = w_ed;
  f__doned = w_ned;
  f__putn = z_putc;
  f__dorevert = iw_rev;
  f__donewrec = z_wnew;
  f__doend = z_endp;
  return (0);
}

integer
e_rsfi (void)
{
  int n;
  f__init &= ~2;
  n = en_fio ();
  f__fmtbuf = NULL;
  return (n);
}

integer
e_wsfi (void)
{
  int n;
  f__init &= ~2;
  n = en_fio ();
  f__fmtbuf = NULL;
  if (f__svic->icirnum != 1
      && (f__icnum > f__svic->icirnum
	  || (f__icnum == f__svic->icirnum && (f__recpos | f__hiwater))))
    err (f__svic->icierr, 110, "inwrite");
  if (f__recpos < f__hiwater)
    f__recpos = f__hiwater;
  if (f__recpos >= f__svic->icirlen)
    err (f__svic->icierr, 110, "recend");
  if (!f__recpos && f__icnum)
    return n;
  while (f__recpos++ < f__svic->icirlen)
    *f__icptr++ = ' ';
  return n;
}
