1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h" 2*c9945492SAndroid Build Coastguard Worker #include "locale_impl.h" 3*c9945492SAndroid Build Coastguard Worker #include <wchar.h> 4*c9945492SAndroid Build Coastguard Worker #include <limits.h> 5*c9945492SAndroid Build Coastguard Worker #include <ctype.h> 6*c9945492SAndroid Build Coastguard Worker #include <string.h> 7*c9945492SAndroid Build Coastguard Worker ungetwc(wint_t c,FILE * f)8*c9945492SAndroid Build Coastguard Workerwint_t ungetwc(wint_t c, FILE *f) 9*c9945492SAndroid Build Coastguard Worker { 10*c9945492SAndroid Build Coastguard Worker unsigned char mbc[MB_LEN_MAX]; 11*c9945492SAndroid Build Coastguard Worker int l; 12*c9945492SAndroid Build Coastguard Worker locale_t *ploc = &CURRENT_LOCALE, loc = *ploc; 13*c9945492SAndroid Build Coastguard Worker 14*c9945492SAndroid Build Coastguard Worker FLOCK(f); 15*c9945492SAndroid Build Coastguard Worker 16*c9945492SAndroid Build Coastguard Worker if (f->mode <= 0) fwide(f, 1); 17*c9945492SAndroid Build Coastguard Worker *ploc = f->locale; 18*c9945492SAndroid Build Coastguard Worker 19*c9945492SAndroid Build Coastguard Worker if (!f->rpos) __toread(f); 20*c9945492SAndroid Build Coastguard Worker if (!f->rpos || c == WEOF || (l = wcrtomb((void *)mbc, c, 0)) < 0 || 21*c9945492SAndroid Build Coastguard Worker f->rpos < f->buf - UNGET + l) { 22*c9945492SAndroid Build Coastguard Worker FUNLOCK(f); 23*c9945492SAndroid Build Coastguard Worker *ploc = loc; 24*c9945492SAndroid Build Coastguard Worker return WEOF; 25*c9945492SAndroid Build Coastguard Worker } 26*c9945492SAndroid Build Coastguard Worker 27*c9945492SAndroid Build Coastguard Worker if (isascii(c)) *--f->rpos = c; 28*c9945492SAndroid Build Coastguard Worker else memcpy(f->rpos -= l, mbc, l); 29*c9945492SAndroid Build Coastguard Worker 30*c9945492SAndroid Build Coastguard Worker f->flags &= ~F_EOF; 31*c9945492SAndroid Build Coastguard Worker 32*c9945492SAndroid Build Coastguard Worker FUNLOCK(f); 33*c9945492SAndroid Build Coastguard Worker *ploc = loc; 34*c9945492SAndroid Build Coastguard Worker return c; 35*c9945492SAndroid Build Coastguard Worker } 36