date and time created 90/06/25 13:56:22 by bostic
[unix-history] / usr / src / usr.bin / f77 / libI77 / douio.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.
*
* @(#)douio.c 5.1 %G%
*/
/*
* unformatted external i/o
*/
#include "fio.h"
LOCAL char *eor = "eor/uio";
LOCAL char *uio = "uio";
LOCAL
do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* sequential */
{
if(reading)
{
recpos += *number * len;
if (recpos > reclen) {
recpos -= *number * len;
e_rsue(); /* in case tries another read */
err(errflag,F_EREREC,eor);
}
if (fread(ptr,(int)len,(int)(*number),cf) != *number)
return(due_err(uio));
}
else
{
reclen += *number * len;
fwrite(ptr,(int)len,(int)(*number),cf);
}
return(OK);
}
do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
{
if(sequential)
return(do_us(number,ptr,len));
else
return(do_ud(number,ptr,len));
}
LOCAL
do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* direct */
{
recpos += *number * len;
if(recpos > curunit->url && curunit->url!=1)
err(errflag,F_EREREC,eor);
if(reading)
{
if (fread(ptr, (int)len, (int)(*number), cf) != *number)
return(due_err(uio));
}
else
fwrite(ptr,(int)len,(int)(*number),cf);
return(OK);
}
due_err(s) char *s;
{
if(feof(cf))
err(endflag,EOF,s)
else
{ clearerr(cf);
err(errflag,errno,s)
}
}