X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdio%2Ffread.c;h=a2116da61370bd829c634353ad6f6fa6732d0d8b;hb=6aeb9c6703670649ee09b3c8575fb428168bb75c;hp=8105fe995d884ffeae8cf4b0492a8baef35e2905;hpb=e3cd6c5c265cd481db6e0c5b529855d99f0bda30;p=musl diff --git a/src/stdio/fread.c b/src/stdio/fread.c index 8105fe99..a2116da6 100644 --- a/src/stdio/fread.c +++ b/src/stdio/fread.c @@ -1,18 +1,19 @@ #include "stdio_impl.h" +#include #define MIN(a,b) ((a)<(b) ? (a) : (b)) -size_t fread(void *destv, size_t size, size_t nmemb, FILE *f) +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; - - /* Never touch the file if length is zero.. */ - if (!l) return 0; + if (!size) nmemb = 0; FLOCK(f); - if (f->rend - f->rpos > 0) { + f->mode |= f->mode-1; + + if (f->rpos != f->rend) { /* First exhaust the buffer. */ k = MIN(f->rend - f->rpos, l); memcpy(dest, f->rpos, k); @@ -21,15 +22,10 @@ size_t fread(void *destv, size_t size, size_t nmemb, FILE *f) l -= k; } - if (!l) { - FUNLOCK(f); - return nmemb; - } - /* Read the remainder directly */ for (; l; l-=k, dest+=k) { - k = f->read(f, dest, l); - if (k+1<=1) { + k = __toread(f) ? 0 : f->read(f, dest, l); + if (!k) { FUNLOCK(f); return (len-l)/size; }