1 #include "stdio_impl.h"
3 #define MIN(a,b) ((a)<(b) ? (a) : (b))
5 size_t fread(void *destv, size_t size, size_t nmemb, FILE *f)
7 unsigned char *dest = destv;
8 size_t len = size*nmemb, l = len, k;
10 /* Never touch the file if length is zero.. */
16 /* First exhaust the buffer. */
17 k = MIN(f->rend - f->rpos, l);
18 memcpy(dest, f->rpos, k);
23 /* Stop on EOF or errors */
24 if (f->flags & (F_EOF|F_ERR|F_NORD)) goto eof;
26 /* Done? Or going unbuffered? */
27 if (!l || l > f->buf_size/2) break;
29 /* Otherwise, refill & read thru buffer. */
33 /* Read the remainder directly */
34 for (; l; l-=k, dest+=k) {
35 k = f->read(f, dest, l);
37 f->flags |= F_EOF | (F_ERR & k);
49 weak_alias(fread, fread_unlocked);