#include "stdio_impl.h" | |
#include "locale_impl.h" | |
#include <wchar.h> | |
#include <limits.h> | |
#include <ctype.h> | |
#include <string.h> | |
wint_t ungetwc(wint_t c, FILE* f) { | |
unsigned char mbc[MB_LEN_MAX]; | |
int l = 1; | |
locale_t *ploc = &CURRENT_LOCALE, loc = *ploc; | |
FLOCK(f); | |
if (f->mode <= 0) | |
fwide(f, 1); | |
*ploc = f->locale; | |
if (!f->rpos) | |
__toread(f); | |
if (!f->rpos || f->rpos < f->buf - UNGET + l || c == WEOF || | |
(!isascii(c) && (l = wctomb((void*)mbc, c)) < 0)) { | |
FUNLOCK(f); | |
*ploc = loc; | |
return WEOF; | |
} | |
if (isascii(c)) | |
*--f->rpos = c; | |
else | |
memcpy(f->rpos -= l, mbc, l); | |
f->flags &= ~F_EOF; | |
FUNLOCK(f); | |
*ploc = loc; | |
return c; | |
} |