xref: /csrg-svn/usr.bin/f77/libI77/sue.c (revision 20984)
12502Sdlw /*
2*20984Slibs char id_sue[] = "@(#)sue.c	1.4";
32502Sdlw  *
42502Sdlw  * sequential unformatted external read/write routines
52502Sdlw  */
62502Sdlw 
72502Sdlw #include "fio.h"
82502Sdlw 
92502Sdlw extern int reclen;
10*20984Slibs LOCAL long recloc;
11*20984Slibs LOCAL char rsue[] = "read sue";
12*20984Slibs LOCAL char wsue[] = "write sue";
132502Sdlw 
142502Sdlw s_rsue(a) cilist *a;
152502Sdlw {
162502Sdlw 	int n;
172502Sdlw 	reading = YES;
182502Sdlw 	if(n=c_sue(a,READ)) return(n);
194116Sdlw 	if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rsue)
202502Sdlw 	recpos = 0;
212502Sdlw 	if(fread(&reclen,sizeof(int),1,cf) == 1) return(OK);
222502Sdlw 	if(feof(cf))
232502Sdlw 	{	curunit->uend = YES;
242502Sdlw 		err(endflag, EOF, rsue)
252502Sdlw 	}
262502Sdlw 	clearerr(cf);
272502Sdlw 	err(errflag, errno, rsue)
282502Sdlw }
292502Sdlw 
302502Sdlw s_wsue(a) cilist *a;
312502Sdlw {
322502Sdlw 	int n;
332502Sdlw 	reading = NO;
342502Sdlw 	if(n=c_sue(a,WRITE)) return(n);
354116Sdlw 	if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsue)
362502Sdlw 	reclen = 0;
372502Sdlw 	recloc=ftell(cf);
382502Sdlw 	fseek(cf,(long)sizeof(int),1);
392502Sdlw 	curunit->uend = NO;
402502Sdlw 	return(OK);
412502Sdlw }
422502Sdlw 
43*20984Slibs LOCAL
442502Sdlw c_sue(a,flag) cilist *a;
452502Sdlw {	int n;
462502Sdlw 	external = sequential = YES;
472502Sdlw 	formatted = NO;
482502Sdlw 	lfname = NULL;
492502Sdlw 	elist = NO;
502502Sdlw 	errflag = a->cierr;
512502Sdlw 	endflag = a->ciend;
522502Sdlw 	lunit = a->ciunit;
534116Sdlw 	if(not_legal(lunit)) err(errflag,F_ERUNIT,rsue+5)
542502Sdlw 	curunit = &units[lunit];
552502Sdlw 	if(!curunit->ufd && (n=fk_open(flag,SEQ,UNF,(ftnint)lunit)))
564116Sdlw 		err(errflag,n,rsue+5)
572502Sdlw 	cf = curunit->ufd;
582502Sdlw 	elist = YES;
592502Sdlw 	lfname = curunit->ufnm;
604116Sdlw 	if(curunit->ufmt) err(errflag,F_ERNOUIO,rsue+5)
614116Sdlw 	if(curunit->url) err(errflag,F_ERNOSIO,rsue+5)
624116Sdlw 	if(!curunit->useek) err(errflag,F_ERSEEK,rsue+5)
632502Sdlw 	return(OK);
642502Sdlw }
652502Sdlw 
662502Sdlw e_wsue()
672502Sdlw {	long loc;
682502Sdlw 	fwrite(&reclen,sizeof(int),1,cf);
692502Sdlw 	loc=ftell(cf);
702502Sdlw 	fseek(cf,recloc,0);
712502Sdlw 	fwrite(&reclen,sizeof(int),1,cf);
722502Sdlw 	fseek(cf,loc,0);
732502Sdlw 	return(OK);
742502Sdlw }
752502Sdlw 
762502Sdlw e_rsue()
772502Sdlw {
782502Sdlw 	fseek(cf,(long)(reclen-recpos+sizeof(int)),1);
792502Sdlw 	return(OK);
802502Sdlw }
81