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/fgetwc.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/fgetwc.c')
-rw-r--r-- | lib/libc/stdio/fgetwc.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c index 7278dad..c726caf 100644 --- a/lib/libc/stdio/fgetwc.c +++ b/lib/libc/stdio/fgetwc.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,18 +39,34 @@ __FBSDID("$FreeBSD$"); wint_t fgetwc(FILE *fp) { - wint_t wc; - long r; + char buf[MB_LEN_MAX]; + mbstate_t mbs; + size_t n, nconv; + int c; + wchar_t wc; ORIENTLOCK(fp, 1); - if ((r = fgetrune(fp)) == _INVALID_RUNE) { - wc = WEOF; - errno = EILSEQ; - } else if (r == EOF) - wc = WEOF; - else - wc = (wint_t)r; + n = 0; + while (n < MB_CUR_MAX) { + if ((c = fgetc(fp)) == EOF) { + if (n == 0) + return (WEOF); + break; + } + buf[n++] = (char)c; + memset(&mbs, 0, sizeof(mbs)); + nconv = mbrtowc(&wc, buf, n, &mbs); + if (nconv == n) + return (wc); + else if (nconv == 0) + return (L'\0'); + else if (nconv == (size_t)-2 || nconv == (size_t)-1) + break; + } - return (wc); + while (n-- != 0) + ungetc((unsigned char)buf[n], fp); + errno = EILSEQ; + return (WEOF); } |