xref: /plan9-contrib/sys/src/ape/lib/ap/stdio/fread.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 /*
2  * pANS stdio -- fread
3  */
4 #include "iolib.h"
5 #include <string.h>
6 
7 #define BIGN (BUFSIZ/2)
8 
9 size_t fread(void *p, size_t recl, size_t nrec, FILE *f){
10 	char *s, *es;
11 	int n, d, c;
12 
13 	s=(char *)p;
14 	n=recl*nrec;
15 	while(n>0){
16 		d=f->wp-f->rp;
17 		if(d>0){
18 			if(d>n)
19 				d=n;
20 			memcpy(s, f->rp, d);
21 			f->rp+=d;
22 		}else{
23 			if(n >= BIGN && f->state==RD && !(f->flags&STRING) && f->buf!=f->unbuf){
24 				d=read(f->fd, s, n);
25 				if(d<=0){
26 					f->state=(d==0)?END:ERR;
27 					goto ret;
28 				}
29 			}else{
30  				c=_IO_getc(f);
31 				if(c==EOF)
32 					goto ret;
33 				*s=c;
34 				d=1;
35 			}
36 		}
37 		s+=d;
38 		n-=d;
39 	}
40     ret:
41 	return (s-(char *)p)/(recl?recl:1);
42 }
43