diff options
Diffstat (limited to 'contrib/libf2c/libI77/due.c')
-rw-r--r-- | contrib/libf2c/libI77/due.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/contrib/libf2c/libI77/due.c b/contrib/libf2c/libI77/due.c new file mode 100644 index 0000000..7c6a801 --- /dev/null +++ b/contrib/libf2c/libI77/due.c @@ -0,0 +1,80 @@ +#include "config.h" +#include "f2c.h" +#include "fio.h" + +int +c_due (cilist * a) +{ + if (f__init != 1) + f_init (); + f__init = 3; + if (a->ciunit >= MXUNIT || a->ciunit < 0) + err (a->cierr, 101, "startio"); + f__sequential = f__formatted = f__recpos = 0; + f__external = 1; + f__curunit = &f__units[a->ciunit]; + if (a->ciunit >= MXUNIT || a->ciunit < 0) + err (a->cierr, 101, "startio"); + f__elist = a; + if (f__curunit->ufd == NULL && fk_open (DIR, UNF, a->ciunit)) + err (a->cierr, 104, "due"); + f__cf = f__curunit->ufd; + if (f__curunit->ufmt) + err (a->cierr, 102, "cdue"); + if (!f__curunit->useek) + err (a->cierr, 104, "cdue"); + if (f__curunit->ufd == NULL) + err (a->cierr, 114, "cdue"); + if (a->cirec <= 0) + err (a->cierr, 130, "due"); + FSEEK (f__cf, (off_t) (a->cirec - 1) * f__curunit->url, SEEK_SET); + f__curunit->uend = 0; + return (0); +} + +integer +s_rdue (cilist * a) +{ + int n; + f__reading = 1; + if ((n = c_due (a))) + return (n); + if (f__curunit->uwrt && f__nowreading (f__curunit)) + err (a->cierr, errno, "read start"); + return (0); +} + +integer +s_wdue (cilist * a) +{ + int n; + f__reading = 0; + if ((n = c_due (a))) + return (n); + if (f__curunit->uwrt != 1 && f__nowwriting (f__curunit)) + err (a->cierr, errno, "write start"); + return (0); +} + +integer +e_rdue (void) +{ + f__init = 1; + if (f__curunit->url == 1 || f__recpos == f__curunit->url) + return (0); + FSEEK (f__cf, (off_t) (f__curunit->url - f__recpos), SEEK_CUR); + if (FTELL (f__cf) % f__curunit->url) + err (f__elist->cierr, 200, "syserr"); + return (0); +} + +integer +e_wdue (void) +{ + f__init = 1; +#ifdef ALWAYS_FLUSH + if (fflush (f__cf)) + err (f__elist->cierr, errno, "write end"); +#endif + return (e_rdue ()); +} |