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