1234567891011121314151617181920212223242526272829303132333435 |
- #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;
- 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;
- }
|