xref: /csrg-svn/usr.bin/f77/libI77/douio.c (revision 23070)
12489Sdlw /*
2*23070Skre  * Copyright (c) 1980 Regents of the University of California.
3*23070Skre  * All rights reserved.  The Berkeley software License Agreement
4*23070Skre  * specifies the terms and conditions for redistribution.
52489Sdlw  *
6*23070Skre  *	@(#)douio.c	5.1	06/07/85
7*23070Skre  */
8*23070Skre 
9*23070Skre /*
102489Sdlw  * unformatted external i/o
112489Sdlw  */
122489Sdlw 
132489Sdlw #include "fio.h"
142489Sdlw 
1520984Slibs LOCAL char *eor = "eor/uio";
1620984Slibs LOCAL char *uio = "uio";
172489Sdlw 
1820984Slibs LOCAL
192489Sdlw do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* sequential */
202489Sdlw {
212489Sdlw 	if(reading)
222489Sdlw 	{
232489Sdlw 		recpos += *number * len;
2419918Slibs 		if (recpos > reclen) {
2519918Slibs 			recpos -= *number * len;
2619918Slibs 			e_rsue(); /* in case tries another read */
272587Sdlw 			err(errflag,F_EREREC,eor);
2819918Slibs 		}
292489Sdlw 
302489Sdlw 		if (fread(ptr,(int)len,(int)(*number),cf) != *number)
312489Sdlw 			return(due_err(uio));
322489Sdlw 	}
332489Sdlw 	else
342489Sdlw 	{
352489Sdlw 		reclen += *number * len;
362489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
372489Sdlw 	}
382489Sdlw 	return(OK);
392489Sdlw }
402489Sdlw 
412489Sdlw do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
422489Sdlw {
432489Sdlw 	if(sequential)
442489Sdlw 		return(do_us(number,ptr,len));
452489Sdlw 	else
462489Sdlw 		return(do_ud(number,ptr,len));
472489Sdlw }
482489Sdlw 
4920984Slibs LOCAL
502489Sdlw do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* direct */
512489Sdlw {
522489Sdlw 	recpos += *number * len;
532489Sdlw 	if(recpos > curunit->url && curunit->url!=1)
542587Sdlw 		err(errflag,F_EREREC,eor);
552489Sdlw 	if(reading)
562489Sdlw 	{
572489Sdlw 		if (fread(ptr, (int)len, (int)(*number), cf) != *number)
582489Sdlw 			return(due_err(uio));
592489Sdlw 	}
602489Sdlw 	else
612489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
622489Sdlw 	return(OK);
632489Sdlw }
642489Sdlw 
652489Sdlw due_err(s) char *s;
662489Sdlw {
672489Sdlw 	if(feof(cf))
682489Sdlw 		err(endflag,EOF,s)
692489Sdlw 	else
702489Sdlw 	{	clearerr(cf);
712489Sdlw 		err(errflag,errno,s)
722489Sdlw 	}
732489Sdlw }
74