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