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