diff options
Diffstat (limited to 'src/stdio/fread.c')
-rw-r--r-- | src/stdio/fread.c | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/src/stdio/fread.c b/src/stdio/fread.c index 0fa0b2aa..8105fe99 100644 --- a/src/stdio/fread.c +++ b/src/stdio/fread.c @@ -12,38 +12,31 @@ size_t fread(void *destv, size_t size, size_t nmemb, FILE *f) FLOCK(f); - for (;;) { + 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; - - /* Stop on EOF or errors */ - if (f->flags & (F_EOF|F_ERR|F_NORD)) goto eof; - - /* Done? Or going unbuffered? */ - if (!l || l > f->buf_size/2) break; - - /* Otherwise, refill & read thru buffer. */ - __underflow(f); + } + + 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) { - f->flags |= F_EOF | (F_ERR & k); - goto eof; + FUNLOCK(f); + return (len-l)/size; } } FUNLOCK(f); return nmemb; -eof: - FUNLOCK(f); - return (len-l)/size; } weak_alias(fread, fread_unlocked); |