/* read sequential formatted external */
#include "config.h"
#include "f2c.h"
#include "fio.h"
#include "fmt.h"

int
xrd_SL (void)
{
  int ch;
  if (!f__curunit->uend)
    while ((ch = getc (f__cf)) != '\n')
      if (ch == EOF)
	{
	  f__curunit->uend = 1;
	  break;
	}
  f__cursor = f__recpos = 0;
  return (1);
}

int
x_getc (void)
{
  int ch;
  if (f__curunit->uend)
    return (EOF);
  ch = getc (f__cf);
  if (ch != EOF && ch != '\n')
    {
      f__recpos++;
      return (ch);
    }
  if (ch == '\n')
    {
      (void) ungetc (ch, f__cf);
      return (ch);
    }
  if (f__curunit->uend || feof (f__cf))
    {
      errno = 0;
      f__curunit->uend = 1;
      return (-1);
    }
  return (-1);
}

int
x_endp (void)
{
  xrd_SL ();
  return f__curunit->uend == 1 ? EOF : 0;
}

int
x_rev (void)
{
  (void) xrd_SL ();
  return (0);
}

integer
s_rsfe (cilist * a)		/* start */
{
  int n;
  if (f__init != 1)
    f_init ();
  f__init = 3;
  f__reading = 1;
  f__sequential = 1;
  f__formatted = 1;
  f__external = 1;
  if ((n = c_sfe (a)))
    return (n);
  f__elist = a;
  f__cursor = f__recpos = 0;
  f__scale = 0;
  f__fmtbuf = a->cifmt;
  f__curunit = &f__units[a->ciunit];
  f__cf = f__curunit->ufd;
  if (pars_f (f__fmtbuf) < 0)
    err (a->cierr, 100, "startio");
  f__getn = x_getc;
  f__doed = rd_ed;
  f__doned = rd_ned;
  fmt_bg ();
  f__doend = x_endp;
  f__donewrec = xrd_SL;
  f__dorevert = x_rev;
  f__cblank = f__curunit->ublnk;
  f__cplus = 0;
  if (f__curunit->uwrt && f__nowreading (f__curunit))
    err (a->cierr, errno, "read start");
  if (f__curunit->uend)
    err (f__elist->ciend, (EOF), "read start");
  return (0);
}
