blob: e7c900d2301412451f42832f8e9b5a8c1bcbf6ac [file] [log] [blame]
#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);