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