clean up stdio_impl.h
[musl] / src / stdio / fwrite.c
1 #include "stdio_impl.h"
2 #include <string.h>
3
4 size_t __fwritex(const unsigned char *restrict s, size_t l, FILE *restrict f)
5 {
6         size_t i=0;
7
8         if (!f->wend && __towrite(f)) return 0;
9
10         if (l > f->wend - f->wpos) return f->write(f, s, l);
11
12         if (f->lbf >= 0) {
13                 /* Match /^(.*\n|)/ */
14                 for (i=l; i && s[i-1] != '\n'; i--);
15                 if (i) {
16                         if (f->write(f, s, i) < i)
17                                 return i;
18                         s += i;
19                         l -= i;
20                 }
21         }
22
23         memcpy(f->wpos, s, l);
24         f->wpos += l;
25         return l+i;
26 }
27
28 size_t fwrite(const void *restrict src, size_t size, size_t nmemb, FILE *restrict f)
29 {
30         size_t k, l = size*nmemb;
31         if (!l) return l;
32         FLOCK(f);
33         k = __fwritex(src, l, f);
34         FUNLOCK(f);
35         return k==l ? nmemb : k/size;
36 }
37
38 weak_alias(fwrite, fwrite_unlocked);