xref: /csrg-svn/usr.bin/f77/libI77/douio.c (revision 19918)
12489Sdlw /*
2*19918Slibs char id_douio[] = "@(#)douio.c	1.3";
32489Sdlw  *
42489Sdlw  * unformatted external i/o
52489Sdlw  */
62489Sdlw 
72489Sdlw #include "fio.h"
82489Sdlw 
92489Sdlw char *eor = "eor/uio";
102489Sdlw char *uio = "uio";
112489Sdlw 
122489Sdlw do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* sequential */
132489Sdlw {
142489Sdlw 	if(reading)
152489Sdlw 	{
162489Sdlw 		recpos += *number * len;
17*19918Slibs 		if (recpos > reclen) {
18*19918Slibs 			recpos -= *number * len;
19*19918Slibs 			e_rsue(); /* in case tries another read */
202587Sdlw 			err(errflag,F_EREREC,eor);
21*19918Slibs 		}
222489Sdlw 
232489Sdlw 		if (fread(ptr,(int)len,(int)(*number),cf) != *number)
242489Sdlw 			return(due_err(uio));
252489Sdlw 	}
262489Sdlw 	else
272489Sdlw 	{
282489Sdlw 		reclen += *number * len;
292489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
302489Sdlw 	}
312489Sdlw 	return(OK);
322489Sdlw }
332489Sdlw 
342489Sdlw do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
352489Sdlw {
362489Sdlw 	if(sequential)
372489Sdlw 		return(do_us(number,ptr,len));
382489Sdlw 	else
392489Sdlw 		return(do_ud(number,ptr,len));
402489Sdlw }
412489Sdlw 
422489Sdlw do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* direct */
432489Sdlw {
442489Sdlw 	recpos += *number * len;
452489Sdlw 	if(recpos > curunit->url && curunit->url!=1)
462587Sdlw 		err(errflag,F_EREREC,eor);
472489Sdlw 	if(reading)
482489Sdlw 	{
492489Sdlw 		if (fread(ptr, (int)len, (int)(*number), cf) != *number)
502489Sdlw 			return(due_err(uio));
512489Sdlw 	}
522489Sdlw 	else
532489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
542489Sdlw 	return(OK);
552489Sdlw }
562489Sdlw 
572489Sdlw due_err(s) char *s;
582489Sdlw {
592489Sdlw 	if(feof(cf))
602489Sdlw 		err(endflag,EOF,s)
612489Sdlw 	else
622489Sdlw 	{	clearerr(cf);
632489Sdlw 		err(errflag,errno,s)
642489Sdlw 	}
652489Sdlw }
66