mirror of
https://github.com/fluencelabs/musl
synced 2025-05-22 04:01:34 +00:00
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
|
#include "stdio_impl.h"
|
||
|
|
||
|
size_t __fwritex(const unsigned char *s, size_t l, FILE *f)
|
||
|
{
|
||
|
size_t i = 0;
|
||
|
size_t k = f->wend - f->wpos;
|
||
|
|
||
|
/* Handle line-buffered mode by breaking into 2 parts */
|
||
|
if (f->lbf >= 0) {
|
||
|
/* Match /^(.*\n|)/ */
|
||
|
for (i=l; i && s[i-1] != '\n'; i--);
|
||
|
if (i) {
|
||
|
f->lbf = EOF;
|
||
|
__fwritex(s, i, f);
|
||
|
f->lbf = '\n';
|
||
|
__oflow(f);
|
||
|
return ferror(f) ? 0 : i + __fwritex(s+i, l-i, f);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Buffer initial segment */
|
||
|
if (k > l) k = l;
|
||
|
memcpy(f->wpos, s, k);
|
||
|
f->wpos += k;
|
||
|
if (f->wpos < f->wend) return l;
|
||
|
|
||
|
/* If there's work left to do, flush buffer */
|
||
|
__oflow(f);
|
||
|
if (ferror(f)) return 0;
|
||
|
|
||
|
/* If the remainder will not fit in buffer, write it directly */
|
||
|
if (l - k >= f->wend - f->wpos)
|
||
|
return k + f->write(f, s+k, l-k);
|
||
|
|
||
|
/* Otherwise, buffer the remainder */
|
||
|
memcpy(f->wpos, s+k, l-k);
|
||
|
f->wpos += l-k;
|
||
|
return l;
|
||
|
}
|
||
|
|
||
|
size_t fwrite(const void *src, size_t size, size_t nmemb, FILE *f)
|
||
|
{
|
||
|
size_t l = size*nmemb;
|
||
|
if (!l) return l;
|
||
|
FLOCK(f);
|
||
|
l = __fwritex(src, l, f);
|
||
|
FUNLOCK(f);
|
||
|
return l/size;
|
||
|
}
|
||
|
|
||
|
weak_alias(fwrite, fwrite_unlocked);
|