| 1 | #include "stdio_impl.h" |
| 2 | #include "locale_impl.h" |
| 3 | #include <wchar.h> |
| 4 | |
| 5 | int fputws(const wchar_t *restrict ws, FILE *restrict f) |
| 6 | { |
| 7 | 	unsigned char buf[BUFSIZ]; |
| 8 | 	size_t l=0; |
| 9 | 	locale_t *ploc = &CURRENT_LOCALE, loc = *ploc; |
| 10 | |
| 11 | 	FLOCK(f); |
| 12 | |
| 13 | 	fwide(f, 1); |
| 14 | 	*ploc = f->locale; |
| 15 | |
| 16 | 	while (ws && (l = wcsrtombs((void *)buf, (void*)&ws, sizeof buf, 0))+1 > 1) |
| 17 | 		if (__fwritex(buf, l, f) < l) { |
| 18 | 			FUNLOCK(f); |
| 19 | 			*ploc = loc; |
| 20 | 			return -1; |
| 21 | 		} |
| 22 | |
| 23 | 	FUNLOCK(f); |
| 24 | |
| 25 | 	*ploc = loc; |
| 26 | 	return l; /* 0 or -1 */ |
| 27 | } |
| 28 | |
| 29 | weak_alias(fputws, fputws_unlocked); |