| 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); |