github.com/afumu/libc@v0.0.6/musl/src/stdio/fread.c (about)

     1  #include "stdio_impl.h"
     2  #include <string.h>
     3  
     4  #define MIN(a,b) ((a)<(b) ? (a) : (b))
     5  
     6  size_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->rpos != f->rend) {
    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) {
    29  			FUNLOCK(f);
    30  			return (len-l)/size;
    31  		}
    32  	}
    33  
    34  	FUNLOCK(f);
    35  	return nmemb;
    36  }
    37  
    38  weak_alias(fread, fread_unlocked);