Index: fusl/src/stdio/fread.c |
diff --git a/fusl/src/stdio/fread.c b/fusl/src/stdio/fread.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..33a65f586ead4649ef537ce53780ea7e12fd0e8e |
--- /dev/null |
+++ b/fusl/src/stdio/fread.c |
@@ -0,0 +1,37 @@ |
+#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; |
+ |
+ 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); |