1 /*-
2 * Copyright (c) 1980 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)douio.c 5.2 (Berkeley) 04/12/91";
10 #endif /* not lint */
11
12 /*
13 * unformatted external i/o
14 */
15
16 #include "fio.h"
17
18 LOCAL char *eor = "eor/uio";
19 LOCAL char *uio = "uio";
20
21 LOCAL
do_us(number,ptr,len)22 do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* sequential */
23 {
24 if(reading)
25 {
26 recpos += *number * len;
27 if (recpos > reclen) {
28 recpos -= *number * len;
29 e_rsue(); /* in case tries another read */
30 err(errflag,F_EREREC,eor);
31 }
32
33 if (fread(ptr,(int)len,(int)(*number),cf) != *number)
34 return(due_err(uio));
35 }
36 else
37 {
38 reclen += *number * len;
39 fwrite(ptr,(int)len,(int)(*number),cf);
40 }
41 return(OK);
42 }
43
do_uio(number,ptr,len)44 do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
45 {
46 if(sequential)
47 return(do_us(number,ptr,len));
48 else
49 return(do_ud(number,ptr,len));
50 }
51
52 LOCAL
do_ud(number,ptr,len)53 do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr; /* direct */
54 {
55 recpos += *number * len;
56 if(recpos > curunit->url && curunit->url!=1)
57 err(errflag,F_EREREC,eor);
58 if(reading)
59 {
60 if (fread(ptr, (int)len, (int)(*number), cf) != *number)
61 return(due_err(uio));
62 }
63 else
64 fwrite(ptr,(int)len,(int)(*number),cf);
65 return(OK);
66 }
67
due_err(s)68 due_err(s) char *s;
69 {
70 if(feof(cf))
71 err(endflag,EOF,s)
72 else
73 { clearerr(cf);
74 err(errflag,errno,s)
75 }
76 }
77