Index: fusl/src/stdio/ungetwc.c |
diff --git a/fusl/src/stdio/ungetwc.c b/fusl/src/stdio/ungetwc.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..80d6e203d0765564a21e016f8be9577f6a3c67a2 |
--- /dev/null |
+++ b/fusl/src/stdio/ungetwc.c |
@@ -0,0 +1,35 @@ |
+#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; |
+} |