xref: /csrg-svn/usr.bin/f77/libI77/sue.c (revision 47943)
1*47943Sbostic /*-
2*47943Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic  * All rights reserved.
42502Sdlw  *
5*47943Sbostic  * %sccs.include.proprietary.c%
623090Skre  */
723090Skre 
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)sue.c	5.3 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic 
1223090Skre /*
132502Sdlw  * sequential unformatted external read/write routines
142502Sdlw  */
152502Sdlw 
162502Sdlw #include "fio.h"
172502Sdlw 
182502Sdlw extern int reclen;
1920984Slibs LOCAL long recloc;
2020984Slibs LOCAL char rsue[] = "read sue";
2120984Slibs LOCAL char wsue[] = "write sue";
222502Sdlw 
s_rsue(a)232502Sdlw s_rsue(a) cilist *a;
242502Sdlw {
252502Sdlw 	int n;
262502Sdlw 	reading = YES;
272502Sdlw 	if(n=c_sue(a,READ)) return(n);
284116Sdlw 	if(curunit->uwrt && ! nowreading(curunit)) err(errflag, errno, rsue)
292502Sdlw 	recpos = 0;
302502Sdlw 	if(fread(&reclen,sizeof(int),1,cf) == 1) return(OK);
312502Sdlw 	if(feof(cf))
322502Sdlw 	{	curunit->uend = YES;
332502Sdlw 		err(endflag, EOF, rsue)
342502Sdlw 	}
352502Sdlw 	clearerr(cf);
362502Sdlw 	err(errflag, errno, rsue)
372502Sdlw }
382502Sdlw 
s_wsue(a)392502Sdlw s_wsue(a) cilist *a;
402502Sdlw {
412502Sdlw 	int n;
422502Sdlw 	reading = NO;
432502Sdlw 	if(n=c_sue(a,WRITE)) return(n);
444116Sdlw 	if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, wsue)
452502Sdlw 	reclen = 0;
462502Sdlw 	recloc=ftell(cf);
472502Sdlw 	fseek(cf,(long)sizeof(int),1);
482502Sdlw 	curunit->uend = NO;
492502Sdlw 	return(OK);
502502Sdlw }
512502Sdlw 
5220984Slibs LOCAL
c_sue(a,flg)5340228Sdonn c_sue(a,flg) cilist *a;
542502Sdlw {	int n;
552502Sdlw 	external = sequential = YES;
562502Sdlw 	formatted = NO;
572502Sdlw 	lfname = NULL;
582502Sdlw 	elist = NO;
592502Sdlw 	errflag = a->cierr;
602502Sdlw 	endflag = a->ciend;
612502Sdlw 	lunit = a->ciunit;
624116Sdlw 	if(not_legal(lunit)) err(errflag,F_ERUNIT,rsue+5)
632502Sdlw 	curunit = &units[lunit];
6440228Sdonn 	if(!curunit->ufd && (n=fk_open(flg,SEQ,UNF,(ftnint)lunit)))
654116Sdlw 		err(errflag,n,rsue+5)
662502Sdlw 	cf = curunit->ufd;
672502Sdlw 	elist = YES;
682502Sdlw 	lfname = curunit->ufnm;
694116Sdlw 	if(curunit->ufmt) err(errflag,F_ERNOUIO,rsue+5)
704116Sdlw 	if(curunit->url) err(errflag,F_ERNOSIO,rsue+5)
714116Sdlw 	if(!curunit->useek) err(errflag,F_ERSEEK,rsue+5)
722502Sdlw 	return(OK);
732502Sdlw }
742502Sdlw 
e_wsue()752502Sdlw e_wsue()
762502Sdlw {	long loc;
772502Sdlw 	fwrite(&reclen,sizeof(int),1,cf);
782502Sdlw 	loc=ftell(cf);
792502Sdlw 	fseek(cf,recloc,0);
802502Sdlw 	fwrite(&reclen,sizeof(int),1,cf);
812502Sdlw 	fseek(cf,loc,0);
822502Sdlw 	return(OK);
832502Sdlw }
842502Sdlw 
e_rsue()852502Sdlw e_rsue()
862502Sdlw {
872502Sdlw 	fseek(cf,(long)(reclen-recpos+sizeof(int)),1);
882502Sdlw 	return(OK);
892502Sdlw }
90