| #include "stdio_impl.h" |
| #include <string.h> |
| |
| #define MIN(a, b) ((a) < (b) ? (a) : (b)) |
| |
| size_t fread(void* restrict destv, |
| size_t size, |
| size_t nmemb, |
| FILE* restrict f) { |
| unsigned char* dest = destv; |
| size_t len = size * nmemb, l = len, k; |
| if (!size) |
| nmemb = 0; |
| |
| FLOCK(f); |
| |
| f->mode |= f->mode - 1; |
| |
| if (f->rend - f->rpos > 0) { |
| /* First exhaust the buffer. */ |
| k = MIN(f->rend - f->rpos, l); |
| memcpy(dest, f->rpos, k); |
| f->rpos += k; |
| dest += k; |
| l -= k; |
| } |
| |
| /* Read the remainder directly */ |
| for (; l; l -= k, dest += k) { |
| k = __toread(f) ? 0 : f->read(f, dest, l); |
| if (k + 1 <= 1) { |
| FUNLOCK(f); |
| return (len - l) / size; |
| } |
| } |
| |
| FUNLOCK(f); |
| return nmemb; |
| } |
| |
| weak_alias(fread, fread_unlocked); |