1219820Sjeff#include "stdio_impl.h" 2219820Sjeff#include <string.h> 3219820Sjeff 4219820Sjeff#define MIN(a,b) ((a)<(b) ? (a) : (b)) 5271127Shselasky 6219820Sjeffsize_t fread(void *restrict destv, size_t size, size_t nmemb, FILE *restrict f) 7219820Sjeff{ 8219820Sjeff unsigned char *dest = destv; 9219820Sjeff size_t len = size*nmemb, l = len, k; 10219820Sjeff if (!size) nmemb = 0; 11219820Sjeff 12219820Sjeff FLOCK(f); 13219820Sjeff 14219820Sjeff f->mode |= f->mode-1; 15219820Sjeff 16219820Sjeff if (f->rend - f->rpos > 0) { 17219820Sjeff /* First exhaust the buffer. */ 18219820Sjeff k = MIN(f->rend - f->rpos, l); 19219820Sjeff memcpy(dest, f->rpos, k); 20219820Sjeff f->rpos += k; 21219820Sjeff dest += k; 22219820Sjeff l -= k; 23219820Sjeff } 24219820Sjeff 25219820Sjeff /* Read the remainder directly */ 26219820Sjeff for (; l; l-=k, dest+=k) { 27219820Sjeff k = __toread(f) ? 0 : f->read(f, dest, l); 28219820Sjeff if (k+1<=1) { 29219820Sjeff FUNLOCK(f); 30219820Sjeff return (len-l)/size; 31219820Sjeff } 32219820Sjeff } 33219820Sjeff 34219820Sjeff FUNLOCK(f); 35219820Sjeff return nmemb; 36219820Sjeff} 37219820Sjeff 38219820Sjeffweak_alias(fread, fread_unlocked); 39219820Sjeff