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