xref: /csrg-svn/usr.bin/f77/libI77/douio.c (revision 47943)
1*47943Sbostic /*-
2*47943Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic  * All rights reserved.
42489Sdlw  *
5*47943Sbostic  * %sccs.include.proprietary.c%
623070Skre  */
723070Skre 
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)douio.c	5.2 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic 
1223070Skre /*
132489Sdlw  * unformatted external i/o
142489Sdlw  */
152489Sdlw 
162489Sdlw #include "fio.h"
172489Sdlw 
1820984Slibs LOCAL char *eor = "eor/uio";
1920984Slibs LOCAL char *uio = "uio";
202489Sdlw 
2120984Slibs LOCAL
do_us(number,ptr,len)222489Sdlw do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* sequential */
232489Sdlw {
242489Sdlw 	if(reading)
252489Sdlw 	{
262489Sdlw 		recpos += *number * len;
2719918Slibs 		if (recpos > reclen) {
2819918Slibs 			recpos -= *number * len;
2919918Slibs 			e_rsue(); /* in case tries another read */
302587Sdlw 			err(errflag,F_EREREC,eor);
3119918Slibs 		}
322489Sdlw 
332489Sdlw 		if (fread(ptr,(int)len,(int)(*number),cf) != *number)
342489Sdlw 			return(due_err(uio));
352489Sdlw 	}
362489Sdlw 	else
372489Sdlw 	{
382489Sdlw 		reclen += *number * len;
392489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
402489Sdlw 	}
412489Sdlw 	return(OK);
422489Sdlw }
432489Sdlw 
do_uio(number,ptr,len)442489Sdlw do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
452489Sdlw {
462489Sdlw 	if(sequential)
472489Sdlw 		return(do_us(number,ptr,len));
482489Sdlw 	else
492489Sdlw 		return(do_ud(number,ptr,len));
502489Sdlw }
512489Sdlw 
5220984Slibs LOCAL
do_ud(number,ptr,len)532489Sdlw do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* direct */
542489Sdlw {
552489Sdlw 	recpos += *number * len;
562489Sdlw 	if(recpos > curunit->url && curunit->url!=1)
572587Sdlw 		err(errflag,F_EREREC,eor);
582489Sdlw 	if(reading)
592489Sdlw 	{
602489Sdlw 		if (fread(ptr, (int)len, (int)(*number), cf) != *number)
612489Sdlw 			return(due_err(uio));
622489Sdlw 	}
632489Sdlw 	else
642489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
652489Sdlw 	return(OK);
662489Sdlw }
672489Sdlw 
due_err(s)682489Sdlw due_err(s) char *s;
692489Sdlw {
702489Sdlw 	if(feof(cf))
712489Sdlw 		err(endflag,EOF,s)
722489Sdlw 	else
732489Sdlw 	{	clearerr(cf);
742489Sdlw 		err(errflag,errno,s)
752489Sdlw 	}
762489Sdlw }
77