projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
optimize nop case of wmemmove
[musl]
/
src
/
stdio
/
fgetws.c
diff --git
a/src/stdio/fgetws.c
b/src/stdio/fgetws.c
index
195cb43
..
b08b304
100644
(file)
--- a/
src/stdio/fgetws.c
+++ b/
src/stdio/fgetws.c
@@
-1,5
+1,6
@@
#include "stdio_impl.h"
#include <wchar.h>
#include "stdio_impl.h"
#include <wchar.h>
+#include <errno.h>
wint_t __fgetwc_unlocked(FILE *);
wint_t __fgetwc_unlocked(FILE *);
@@
-11,6
+12,10
@@
wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
FLOCK(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;
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 (c == '\n') break;
}
*p = 0;
- if (ferror(f)) p = s;
+ if (ferror(f)
|| errno==EILSEQ
) p = s;
FUNLOCK(f);
FUNLOCK(f);