xref: /original-bsd/usr.bin/f77/libI77/due.c (revision 5998a314)
1 /*
2 char id_due[] = "@(#)due.c	1.3";
3  *
4  * direct unformatted external i/o
5  */
6 
7 #include "fio.h"
8 
9 char rdue[] = "read due";
10 char wdue[] = "write due";
11 
12 s_rdue(a) cilist *a;
13 {
14 	int n;
15 	reading = YES;
16 	if(n=c_due(a,READ)) return(n);
17 	if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rdue);
18 	return(OK);
19 }
20 
21 s_wdue(a) cilist *a;
22 {
23 	int n;
24 	reading = NO;
25 	if(n=c_due(a,WRITE)) return(n);
26 	curunit->uend = NO;
27 	if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wdue)
28 	return(OK);
29 }
30 
31 c_due(a,flag) cilist *a;
32 {	int n;
33 	lfname = NULL;
34 	elist = NO;
35 	sequential=formatted=NO;
36 	recpos = reclen = 0;
37 	external = YES;
38 	errflag = a->cierr;
39 	endflag = a->ciend;
40 	lunit = a->ciunit;
41 	if(not_legal(lunit)) err(errflag,F_ERUNIT,rdue+5);
42 	curunit = &units[lunit];
43 	if (!curunit->ufd && (n=fk_open(flag,DIR,UNF,(ftnint)lunit)) )
44 		err(errflag,n,rdue+5)
45 	cf = curunit->ufd;
46 	elist = YES;
47 	lfname = curunit->ufnm;
48 	if (curunit->ufmt) err(errflag,F_ERNOUIO,rdue+5)
49 	if (!curunit->useek || !curunit->url) err(errflag,F_ERNODIO,rdue+5)
50 	if (fseek(cf, (long)((a->cirec-1)*curunit->url), 0) < 0)
51 		return(due_err(rdue+5));
52 	else
53 		return(OK);
54 }
55 
56 e_rdue()
57 {
58 	return(OK);
59 }
60 
61 e_wdue()
62 {/*	This is to ensure full records. It is really necessary. */
63 	int n = 0;
64 	if (curunit->url!=1 && recpos!=curunit->url &&
65 	    (fseek(cf, (long)(curunit->url-recpos-1), 1) < 0
66 		|| fwrite(&n, 1, 1, cf) != 1))
67 			return(due_err(rdue+5));
68 	return(OK);
69 }
70