1*47943Sbostic /*-
2*47943Sbostic * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic * All rights reserved.
42489Sdlw *
5*47943Sbostic * %sccs.include.proprietary.c%
623070Skre */
723070Skre
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)douio.c 5.2 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic
1223070Skre /*
132489Sdlw * unformatted external i/o
142489Sdlw */
152489Sdlw
162489Sdlw #include "fio.h"
172489Sdlw
1820984Slibs LOCAL char *eor = "eor/uio";
1920984Slibs LOCAL char *uio = "uio";
202489Sdlw
2120984Slibs LOCAL
do_us(number,ptr,len)222489Sdlw do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* sequential */
232489Sdlw {
242489Sdlw if(reading)
252489Sdlw {
262489Sdlw recpos += *number * len;
2719918Slibs if (recpos > reclen) {
2819918Slibs recpos -= *number * len;
2919918Slibs e_rsue(); /* in case tries another read */
302587Sdlw err(errflag,F_EREREC,eor);
3119918Slibs }
322489Sdlw
332489Sdlw if (fread(ptr,(int)len,(int)(*number),cf) != *number)
342489Sdlw return(due_err(uio));
352489Sdlw }
362489Sdlw else
372489Sdlw {
382489Sdlw reclen += *number * len;
392489Sdlw fwrite(ptr,(int)len,(int)(*number),cf);
402489Sdlw }
412489Sdlw return(OK);
422489Sdlw }
432489Sdlw
do_uio(number,ptr,len)442489Sdlw do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
452489Sdlw {
462489Sdlw if(sequential)
472489Sdlw return(do_us(number,ptr,len));
482489Sdlw else
492489Sdlw return(do_ud(number,ptr,len));
502489Sdlw }
512489Sdlw
5220984Slibs LOCAL
do_ud(number,ptr,len)532489Sdlw do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* direct */
542489Sdlw {
552489Sdlw recpos += *number * len;
562489Sdlw if(recpos > curunit->url && curunit->url!=1)
572587Sdlw err(errflag,F_EREREC,eor);
582489Sdlw if(reading)
592489Sdlw {
602489Sdlw if (fread(ptr, (int)len, (int)(*number), cf) != *number)
612489Sdlw return(due_err(uio));
622489Sdlw }
632489Sdlw else
642489Sdlw fwrite(ptr,(int)len,(int)(*number),cf);
652489Sdlw return(OK);
662489Sdlw }
672489Sdlw
due_err(s)682489Sdlw due_err(s) char *s;
692489Sdlw {
702489Sdlw if(feof(cf))
712489Sdlw err(endflag,EOF,s)
722489Sdlw else
732489Sdlw { clearerr(cf);
742489Sdlw err(errflag,errno,s)
752489Sdlw }
762489Sdlw }
77