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