#include "stdio_impl.h" | |
#include <string.h> | |
size_t __fwritex(const unsigned char* restrict s, size_t l, FILE* restrict f) { | |
size_t i = 0; | |
if (!f->wend && __towrite(f)) | |
return 0; | |
if (l > f->wend - f->wpos) | |
return f->write(f, s, l); | |
if (f->lbf >= 0) { | |
/* Match /^(.*\n|)/ */ | |
for (i = l; i && s[i - 1] != '\n'; i--) | |
; | |
if (i) { | |
size_t n = f->write(f, s, i); | |
if (n < i) | |
return n; | |
s += i; | |
l -= i; | |
} | |
} | |
memcpy(f->wpos, s, l); | |
f->wpos += l; | |
return l + i; | |
} | |
size_t fwrite(const void* restrict src, | |
size_t size, | |
size_t nmemb, | |
FILE* restrict f) { | |
size_t k, l = size * nmemb; | |
if (!size) | |
nmemb = 0; | |
FLOCK(f); | |
k = __fwritex(src, l, f); | |
FUNLOCK(f); | |
return k == l ? nmemb : k / size; | |
} | |
weak_alias(fwrite, fwrite_unlocked); |