xref: /aosp_15_r20/external/musl/src/stdio/fputwc.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 #include <limits.h>
5*c9945492SAndroid Build Coastguard Worker #include <ctype.h>
6*c9945492SAndroid Build Coastguard Worker 
__fputwc_unlocked(wchar_t c,FILE * f)7*c9945492SAndroid Build Coastguard Worker wint_t __fputwc_unlocked(wchar_t c, FILE *f)
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker 	char mbc[MB_LEN_MAX];
10*c9945492SAndroid Build Coastguard Worker 	int l;
11*c9945492SAndroid Build Coastguard Worker 	locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
12*c9945492SAndroid Build Coastguard Worker 
13*c9945492SAndroid Build Coastguard Worker 	if (f->mode <= 0) fwide(f, 1);
14*c9945492SAndroid Build Coastguard Worker 	*ploc = f->locale;
15*c9945492SAndroid Build Coastguard Worker 
16*c9945492SAndroid Build Coastguard Worker 	if (isascii(c)) {
17*c9945492SAndroid Build Coastguard Worker 		c = putc_unlocked(c, f);
18*c9945492SAndroid Build Coastguard Worker 	} else if (f->wpos + MB_LEN_MAX < f->wend) {
19*c9945492SAndroid Build Coastguard Worker 		l = wctomb((void *)f->wpos, c);
20*c9945492SAndroid Build Coastguard Worker 		if (l < 0) c = WEOF;
21*c9945492SAndroid Build Coastguard Worker 		else f->wpos += l;
22*c9945492SAndroid Build Coastguard Worker 	} else {
23*c9945492SAndroid Build Coastguard Worker 		l = wctomb(mbc, c);
24*c9945492SAndroid Build Coastguard Worker 		if (l < 0 || __fwritex((void *)mbc, l, f) < l) c = WEOF;
25*c9945492SAndroid Build Coastguard Worker 	}
26*c9945492SAndroid Build Coastguard Worker 	if (c==WEOF) f->flags |= F_ERR;
27*c9945492SAndroid Build Coastguard Worker 	*ploc = loc;
28*c9945492SAndroid Build Coastguard Worker 	return c;
29*c9945492SAndroid Build Coastguard Worker }
30*c9945492SAndroid Build Coastguard Worker 
fputwc(wchar_t c,FILE * f)31*c9945492SAndroid Build Coastguard Worker wint_t fputwc(wchar_t c, FILE *f)
32*c9945492SAndroid Build Coastguard Worker {
33*c9945492SAndroid Build Coastguard Worker 	FLOCK(f);
34*c9945492SAndroid Build Coastguard Worker 	c = __fputwc_unlocked(c, f);
35*c9945492SAndroid Build Coastguard Worker 	FUNLOCK(f);
36*c9945492SAndroid Build Coastguard Worker 	return c;
37*c9945492SAndroid Build Coastguard Worker }
38*c9945492SAndroid Build Coastguard Worker 
39*c9945492SAndroid Build Coastguard Worker weak_alias(__fputwc_unlocked, fputwc_unlocked);
40*c9945492SAndroid Build Coastguard Worker weak_alias(__fputwc_unlocked, putwc_unlocked);
41