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