xref: /csrg-svn/usr.bin/f77/libI77/douio.c (revision 2587)
12489Sdlw /*
2*2587Sdlw char id_douio[] = "@(#)douio.c	1.2";
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;
172489Sdlw 		if (recpos > reclen)
18*2587Sdlw 			err(errflag,F_EREREC,eor);
192489Sdlw 
202489Sdlw 		if (fread(ptr,(int)len,(int)(*number),cf) != *number)
212489Sdlw 			return(due_err(uio));
222489Sdlw 	}
232489Sdlw 	else
242489Sdlw 	{
252489Sdlw 		reclen += *number * len;
262489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
272489Sdlw 	}
282489Sdlw 	return(OK);
292489Sdlw }
302489Sdlw 
312489Sdlw do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
322489Sdlw {
332489Sdlw 	if(sequential)
342489Sdlw 		return(do_us(number,ptr,len));
352489Sdlw 	else
362489Sdlw 		return(do_ud(number,ptr,len));
372489Sdlw }
382489Sdlw 
392489Sdlw do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* direct */
402489Sdlw {
412489Sdlw 	recpos += *number * len;
422489Sdlw 	if(recpos > curunit->url && curunit->url!=1)
43*2587Sdlw 		err(errflag,F_EREREC,eor);
442489Sdlw 	if(reading)
452489Sdlw 	{
462489Sdlw 		if (fread(ptr, (int)len, (int)(*number), cf) != *number)
472489Sdlw 			return(due_err(uio));
482489Sdlw 	}
492489Sdlw 	else
502489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
512489Sdlw 	return(OK);
522489Sdlw }
532489Sdlw 
542489Sdlw due_err(s) char *s;
552489Sdlw {
562489Sdlw 	if(feof(cf))
572489Sdlw 		err(endflag,EOF,s)
582489Sdlw 	else
592489Sdlw 	{	clearerr(cf);
602489Sdlw 		err(errflag,errno,s)
612489Sdlw 	}
622489Sdlw }
63