xref: /csrg-svn/usr.bin/f77/libI77/sue.c (revision 20984)
1 /*
2 char id_sue[] = "@(#)sue.c	1.4";
3  *
4  * sequential unformatted external read/write routines
5  */
6 
7 #include "fio.h"
8 
9 extern int reclen;
10 LOCAL long recloc;
11 LOCAL char rsue[] = "read sue";
12 LOCAL char wsue[] = "write sue";
13 
14 s_rsue(a) cilist *a;
15 {
16 	int n;
17 	reading = YES;
18 	if(n=c_sue(a,READ)) return(n);
19 	if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rsue)
20 	recpos = 0;
21 	if(fread(&reclen,sizeof(int),1,cf) == 1) return(OK);
22 	if(feof(cf))
23 	{	curunit->uend = YES;
24 		err(endflag, EOF, rsue)
25 	}
26 	clearerr(cf);
27 	err(errflag, errno, rsue)
28 }
29 
30 s_wsue(a) cilist *a;
31 {
32 	int n;
33 	reading = NO;
34 	if(n=c_sue(a,WRITE)) return(n);
35 	if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsue)
36 	reclen = 0;
37 	recloc=ftell(cf);
38 	fseek(cf,(long)sizeof(int),1);
39 	curunit->uend = NO;
40 	return(OK);
41 }
42 
43 LOCAL
44 c_sue(a,flag) cilist *a;
45 {	int n;
46 	external = sequential = YES;
47 	formatted = NO;
48 	lfname = NULL;
49 	elist = NO;
50 	errflag = a->cierr;
51 	endflag = a->ciend;
52 	lunit = a->ciunit;
53 	if(not_legal(lunit)) err(errflag,F_ERUNIT,rsue+5)
54 	curunit = &units[lunit];
55 	if(!curunit->ufd && (n=fk_open(flag,SEQ,UNF,(ftnint)lunit)))
56 		err(errflag,n,rsue+5)
57 	cf = curunit->ufd;
58 	elist = YES;
59 	lfname = curunit->ufnm;
60 	if(curunit->ufmt) err(errflag,F_ERNOUIO,rsue+5)
61 	if(curunit->url) err(errflag,F_ERNOSIO,rsue+5)
62 	if(!curunit->useek) err(errflag,F_ERSEEK,rsue+5)
63 	return(OK);
64 }
65 
66 e_wsue()
67 {	long loc;
68 	fwrite(&reclen,sizeof(int),1,cf);
69 	loc=ftell(cf);
70 	fseek(cf,recloc,0);
71 	fwrite(&reclen,sizeof(int),1,cf);
72 	fseek(cf,loc,0);
73 	return(OK);
74 }
75 
76 e_rsue()
77 {
78 	fseek(cf,(long)(reclen-recpos+sizeof(int)),1);
79 	return(OK);
80 }
81