1#include "stdio_impl.h" 2#include <string.h> 3 4#define MIN(a,b) ((a)<(b) ? (a) : (b)) 5 6size_t fread(void *restrict destv, size_t size, size_t nmemb, FILE *restrict f) 7{ 8 unsigned char *dest = destv; 9 size_t len = size*nmemb, l = len, k; 10 if (!size) nmemb = 0; 11 12 FLOCK(f); 13 14 f->mode |= f->mode-1; 15 16 if (f->rend - f->rpos > 0) { 17 /* First exhaust the buffer. */ 18 k = MIN(f->rend - f->rpos, l); 19 memcpy(dest, f->rpos, k); 20 f->rpos += k; 21 dest += k; 22 l -= k; 23 } 24 25 /* Read the remainder directly */ 26 for (; l; l-=k, dest+=k) { 27 k = __toread(f) ? 0 : f->read(f, dest, l); 28 if (k+1<=1) { 29 FUNLOCK(f); 30 return (len-l)/size; 31 } 32 } 33 34 FUNLOCK(f); 35 return nmemb; 36} 37 38weak_alias(fread, fread_unlocked); 39