xref: /original-bsd/usr.bin/f77/libI77/douio.c (revision a91856c6)
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
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 
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
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 
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