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