xref: /aosp_15_r20/external/musl/src/stdio/fputws.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include "locale_impl.h"
3*c9945492SAndroid Build Coastguard Worker #include <wchar.h>
4*c9945492SAndroid Build Coastguard Worker 
fputws(const wchar_t * restrict ws,FILE * restrict f)5*c9945492SAndroid Build Coastguard Worker int fputws(const wchar_t *restrict ws, FILE *restrict f)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker 	unsigned char buf[BUFSIZ];
8*c9945492SAndroid Build Coastguard Worker 	size_t l=0;
9*c9945492SAndroid Build Coastguard Worker 	locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
10*c9945492SAndroid Build Coastguard Worker 
11*c9945492SAndroid Build Coastguard Worker 	FLOCK(f);
12*c9945492SAndroid Build Coastguard Worker 
13*c9945492SAndroid Build Coastguard Worker 	fwide(f, 1);
14*c9945492SAndroid Build Coastguard Worker 	*ploc = f->locale;
15*c9945492SAndroid Build Coastguard Worker 
16*c9945492SAndroid Build Coastguard Worker 	while (ws && (l = wcsrtombs((void *)buf, (void*)&ws, sizeof buf, 0))+1 > 1)
17*c9945492SAndroid Build Coastguard Worker 		if (__fwritex(buf, l, f) < l) {
18*c9945492SAndroid Build Coastguard Worker 			FUNLOCK(f);
19*c9945492SAndroid Build Coastguard Worker 			*ploc = loc;
20*c9945492SAndroid Build Coastguard Worker 			return -1;
21*c9945492SAndroid Build Coastguard Worker 		}
22*c9945492SAndroid Build Coastguard Worker 
23*c9945492SAndroid Build Coastguard Worker 	FUNLOCK(f);
24*c9945492SAndroid Build Coastguard Worker 
25*c9945492SAndroid Build Coastguard Worker 	*ploc = loc;
26*c9945492SAndroid Build Coastguard Worker 	return l; /* 0 or -1 */
27*c9945492SAndroid Build Coastguard Worker }
28*c9945492SAndroid Build Coastguard Worker 
29*c9945492SAndroid Build Coastguard Worker weak_alias(fputws, fputws_unlocked);
30