diff options
Diffstat (limited to 'src/stdio')
-rw-r--r-- | src/stdio/fgetws.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/stdio/fgetws.c b/src/stdio/fgetws.c index 195cb435..b08b3049 100644 --- a/src/stdio/fgetws.c +++ b/src/stdio/fgetws.c @@ -1,5 +1,6 @@ #include "stdio_impl.h" #include <wchar.h> +#include <errno.h> wint_t __fgetwc_unlocked(FILE *); @@ -11,6 +12,10 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f) FLOCK(f); + /* Setup a dummy errno so we can detect EILSEQ. This is + * the only way to catch encoding errors in the form of a + * partial character just before EOF. */ + errno = EAGAIN; for (; n; n--) { wint_t c = __fgetwc_unlocked(f); if (c == WEOF) break; @@ -18,7 +23,7 @@ wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f) if (c == '\n') break; } *p = 0; - if (ferror(f)) p = s; + if (ferror(f) || errno==EILSEQ) p = s; FUNLOCK(f); |