1 #include "stdio_impl.h"
3 size_t __fwritex(const unsigned char *s, size_t l, FILE *f)
6 size_t k = f->wend - f->wpos;
8 /* Handle line-buffered mode by breaking into 2 parts */
10 /* Match /^(.*\n|)/ */
11 for (i=l; i && s[i-1] != '\n'; i--);
17 return ferror(f) ? 0 : i + __fwritex(s+i, l-i, f);
21 /* Buffer initial segment */
23 memcpy(f->wpos, s, k);
25 if (f->wpos < f->wend) return l;
27 /* If there's work left to do, flush buffer */
29 if (ferror(f)) return 0;
31 /* If the remainder will not fit in buffer, write it directly */
32 if (l - k >= f->wend - f->wpos)
33 return k + f->write(f, s+k, l-k);
35 /* Otherwise, buffer the remainder */
36 memcpy(f->wpos, s+k, l-k);
41 size_t fwrite(const void *src, size_t size, size_t nmemb, FILE *f)
43 size_t l = size*nmemb;
46 l = __fwritex(src, l, f);
51 weak_alias(fwrite, fwrite_unlocked);