fputwc.c 812 字节
Newer Older
R
Rich Felker 已提交
1
#include "stdio_impl.h"
2
#include "locale_impl.h"
R
Rich Felker 已提交
3 4 5
#include <wchar.h>
#include <limits.h>
#include <ctype.h>
R
Rich Felker 已提交
6 7 8 9 10

wint_t __fputwc_unlocked(wchar_t c, FILE *f)
{
	char mbc[MB_LEN_MAX];
	int l;
11
	locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;
R
Rich Felker 已提交
12

13
	if (f->mode <= 0) fwide(f, 1);
14
	*ploc = f->locale;
R
Rich Felker 已提交
15 16

	if (isascii(c)) {
17
		c = putc_unlocked(c, f);
R
Rich Felker 已提交
18
	} else if (f->wpos + MB_LEN_MAX < f->wend) {
19
		l = wctomb((void *)f->wpos, c);
R
Rich Felker 已提交
20 21 22 23
		if (l < 0) c = WEOF;
		else f->wpos += l;
	} else {
		l = wctomb(mbc, c);
24
		if (l < 0 || __fwritex((void *)mbc, l, f) < l) c = WEOF;
R
Rich Felker 已提交
25
	}
26 27
	if (c==WEOF) f->flags |= F_ERR;
	*ploc = loc;
R
Rich Felker 已提交
28 29 30 31 32 33 34 35
	return c;
}

wint_t fputwc(wchar_t c, FILE *f)
{
	FLOCK(f);
	c = __fputwc_unlocked(c, f);
	FUNLOCK(f);
R
Rich Felker 已提交
36
	return c;
R
Rich Felker 已提交
37 38 39 40
}

weak_alias(__fputwc_unlocked, fputwc_unlocked);
weak_alias(__fputwc_unlocked, putwc_unlocked);