diff options
author | tjr <tjr@FreeBSD.org> | 2002-09-18 05:58:11 +0000 |
---|---|---|
committer | tjr <tjr@FreeBSD.org> | 2002-09-18 05:58:11 +0000 |
commit | 5bb288ec923336fc582dae1b5ee61a4965037b5f (patch) | |
tree | 89b31678132bc76b873bf1bba095a04aa70ff775 /lib/libc/stdio/ungetwc.c | |
parent | 2db6065cba040afe3448b330df0a30ed74c303da (diff) | |
download | FreeBSD-src-5bb288ec923336fc582dae1b5ee61a4965037b5f.zip FreeBSD-src-5bb288ec923336fc582dae1b5ee61a4965037b5f.tar.gz |
Reimplement the functionality of fgetrune(), fputrune(), and fungetrune()
here in terms of mbrtowc(), wcrtomb(), and the single-byte I/O functions.
The rune I/O functions are about to become deprecated in favour of the
ones provided by ISO C90 Amd. 1 and C99.
Diffstat (limited to 'lib/libc/stdio/ungetwc.c')
-rw-r--r-- | lib/libc/stdio/ungetwc.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/libc/stdio/ungetwc.c b/lib/libc/stdio/ungetwc.c index 2a50986..0783fa9 100644 --- a/lib/libc/stdio/ungetwc.c +++ b/lib/libc/stdio/ungetwc.c @@ -29,8 +29,8 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" #include <errno.h> -#include <rune.h> #include <stdio.h> +#include <stdlib.h> #include <wchar.h> #include "un-namespace.h" #include "libc_private.h" @@ -39,8 +39,21 @@ __FBSDID("$FreeBSD$"); wint_t ungetwc(wint_t wc, FILE *fp) { + char buf[MB_LEN_MAX]; + mbstate_t mbs; + size_t len; ORIENTLOCK(fp, 1); - return (fungetrune((rune_t)wc, fp) == EOF ? WEOF : wc); + if (wc == WEOF) + return (WEOF); + + memset(&mbs, 0, sizeof(mbs)); + if ((len = wcrtomb(buf, wc, &mbs)) == (size_t)-1) + return (WEOF); + while (len-- != 0) + if (ungetc((unsigned char)buf[len], fp) == EOF) + return (WEOF); + + return (wc); } |