#include "stdio_impl.h" #include "locale_impl.h" #include #include #include #include wint_t ungetwc(wint_t c, FILE *f) { unsigned char mbc[MB_LEN_MAX]; int l; 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 || c == WEOF || (l = wcrtomb((void *)mbc, c, 0)) < 0 || f->rpos < f->buf - UNGET + l) { 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; }