diff options
Diffstat (limited to 'libf2c/libI77/rsfe.c')
-rw-r--r-- | libf2c/libI77/rsfe.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/libf2c/libI77/rsfe.c b/libf2c/libI77/rsfe.c new file mode 100644 index 0000000..0dcda39 --- /dev/null +++ b/libf2c/libI77/rsfe.c @@ -0,0 +1,97 @@ +/* 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); +} |