xref: /csrg-svn/usr.bin/f77/libI77/douio.c (revision 2489)
1*2489Sdlw /*
2*2489Sdlw char id_douio[] = "@(#)douio.c	1.1";
3*2489Sdlw  *
4*2489Sdlw  * unformatted external i/o
5*2489Sdlw  */
6*2489Sdlw 
7*2489Sdlw #include "fio.h"
8*2489Sdlw 
9*2489Sdlw char *eor = "eor/uio";
10*2489Sdlw char *uio = "uio";
11*2489Sdlw 
12*2489Sdlw do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* sequential */
13*2489Sdlw {
14*2489Sdlw 	if(reading)
15*2489Sdlw 	{
16*2489Sdlw 		recpos += *number * len;
17*2489Sdlw 		if (recpos > reclen)
18*2489Sdlw 			err(errflag,110,eor);
19*2489Sdlw 
20*2489Sdlw 		if (fread(ptr,(int)len,(int)(*number),cf) != *number)
21*2489Sdlw 			return(due_err(uio));
22*2489Sdlw 	}
23*2489Sdlw 	else
24*2489Sdlw 	{
25*2489Sdlw 		reclen += *number * len;
26*2489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
27*2489Sdlw 	}
28*2489Sdlw 	return(OK);
29*2489Sdlw }
30*2489Sdlw 
31*2489Sdlw do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
32*2489Sdlw {
33*2489Sdlw 	if(sequential)
34*2489Sdlw 		return(do_us(number,ptr,len));
35*2489Sdlw 	else
36*2489Sdlw 		return(do_ud(number,ptr,len));
37*2489Sdlw }
38*2489Sdlw 
39*2489Sdlw do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr;  /* direct */
40*2489Sdlw {
41*2489Sdlw 	recpos += *number * len;
42*2489Sdlw 	if(recpos > curunit->url && curunit->url!=1)
43*2489Sdlw 		err(errflag,110,eor);
44*2489Sdlw 	if(reading)
45*2489Sdlw 	{
46*2489Sdlw 		if (fread(ptr, (int)len, (int)(*number), cf) != *number)
47*2489Sdlw 			return(due_err(uio));
48*2489Sdlw 	}
49*2489Sdlw 	else
50*2489Sdlw 		fwrite(ptr,(int)len,(int)(*number),cf);
51*2489Sdlw 	return(OK);
52*2489Sdlw }
53*2489Sdlw 
54*2489Sdlw due_err(s) char *s;
55*2489Sdlw {
56*2489Sdlw 	if(feof(cf))
57*2489Sdlw 		err(endflag,EOF,s)
58*2489Sdlw 	else
59*2489Sdlw 	{	clearerr(cf);
60*2489Sdlw 		err(errflag,errno,s)
61*2489Sdlw 	}
62*2489Sdlw }
63