diff options
Diffstat (limited to 'src/stdio/fread.c')
-rw-r--r-- | src/stdio/fread.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/stdio/fread.c b/src/stdio/fread.c new file mode 100644 index 00000000..692e3e18 --- /dev/null +++ b/src/stdio/fread.c @@ -0,0 +1,39 @@ +#include <stdio.h> +#include "nonstd/io.h" + +/** read directly from a file stream **/ +size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream) +{ + unsigned char *buf = ptr; + size_t n = 0; + flockfile(stream); + while (nmemb) { + size_t i; + for (i = 0; i < size; i++) { + int c = fgetc(stream); + if (c == EOF) { + /* an error */ + } else { + buf[i] = (char)c; + } + } + nmemb--; + buf += size; + n++; + } + funlockfile(stream); + /* + RETURN_SUCCESS(the number of elements read); + */ + return n; +} + +/*** +reads up to ARGUMENT(nmemb) elements of ARGUMENT(size) bytes each +from ARGUMENT(stream) into the array at ARGUMENT(ptr). + +The file position indicate is advanced by the number of bytes read. +***/ +/* +STDC(1) +*/ |