xref: /plan9/sys/src/ape/lib/ap/stdio/fread.c (revision 4b348146ee41394218745eb875dd9cbef009ee68)
1 /*
2  * pANS stdio -- fread
3  */
4 #include "iolib.h"
5 #include <string.h>
6 
7 #define BIGN (BUFSIZ/2)
8 
fread(void * p,size_t recl,size_t nrec,FILE * f)9 size_t fread(void *p, size_t recl, size_t nrec, FILE *f){
10 	char *s;
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 	if(recl)
42 		return (s-(char*)p)/recl;
43 	else
44 		return s-(char*)p;
45 }
46