39 lines
732 B
C
39 lines
732 B
C
|
#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);
|