1#include "locale_impl.h" 2#include "stdio_impl.h" 3#include <ctype.h> 4#include <limits.h> 5#include <wchar.h> 6 7wint_t __fputwc_unlocked(wchar_t c, FILE* f) { 8 char mbc[MB_LEN_MAX]; 9 int l; 10 locale_t *ploc = &CURRENT_LOCALE, loc = *ploc; 11 12 if (f->mode <= 0) 13 fwide(f, 1); 14 *ploc = f->locale; 15 16 if (isascii(c)) { 17 c = putc_unlocked(c, f); 18 } else if (f->wpos + MB_LEN_MAX < f->wend) { 19 l = wctomb((void*)f->wpos, c); 20 if (l < 0) 21 c = WEOF; 22 else 23 f->wpos += l; 24 } else { 25 l = wctomb(mbc, c); 26 if (l < 0 || __fwritex((void*)mbc, l, f) < l) 27 c = WEOF; 28 } 29 if (c == WEOF) 30 f->flags |= F_ERR; 31 *ploc = loc; 32 return c; 33} 34 35wint_t fputwc(wchar_t c, FILE* f) { 36 FLOCK(f); 37 c = __fputwc_unlocked(c, f); 38 FUNLOCK(f); 39 return c; 40} 41 42weak_alias(__fputwc_unlocked, fputwc_unlocked); 43weak_alias(__fputwc_unlocked, putwc_unlocked); 44