github.com/afumu/libc@v0.0.6/musl/src/stdio/fputwc.c (about) 1 #include "stdio_impl.h" 2 #include "locale_impl.h" 3 #include <wchar.h> 4 #include <limits.h> 5 #include <ctype.h> 6 7 wint_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 31 wint_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 39 weak_alias(__fputwc_unlocked, fputwc_unlocked); 40 weak_alias(__fputwc_unlocked, putwc_unlocked);