summaryrefslogtreecommitdiff
path: root/src/wchar/fgetwc.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-02-08 18:42:39 -0500
committerJakob Kaivo <jkk@ung.org>2019-02-08 18:42:39 -0500
commit7ef8a7379f7f7d09e71ccae2a0b688c3cd80423f (patch)
tree092ab0aed1769117fd7b28b8592f6f96b0e0d5af /src/wchar/fgetwc.c
parent6acf19370e8adff79cd83b257d3f04aeaf2a59dd (diff)
merge sources into single tree
Diffstat (limited to 'src/wchar/fgetwc.c')
-rw-r--r--src/wchar/fgetwc.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/wchar/fgetwc.c b/src/wchar/fgetwc.c
new file mode 100644
index 00000000..30d98083
--- /dev/null
+++ b/src/wchar/fgetwc.c
@@ -0,0 +1,35 @@
+#include <wchar.h>
+#include "stdio.h"
+#include "nonstd/io.h"
+#include "limits.h"
+
+wint_t fgetwc(FILE * stream)
+{
+ if (fwide(stream, 1) <= 0) {
+
+ return WEOF;
+ }
+
+ flockfile(stream);
+ stream->orientation = -1;
+
+ char mbr[MB_LEN_MAX+1] = {0};
+ int n = 0;
+ mbstate_t ps = 0;
+ wint_t wc = 0;
+
+ /* FIXME: check for (size_t)-2 and (size_t)-1 from mbrtowc */
+ do {
+ mbr[n++] = getc_unlocked(stream);
+ ps = 0;
+ } while (mbrtowc(&wc, mbr, n, &ps) != 0);
+
+ stream->orientation = 1;
+ funlockfile(stream);
+
+ return wc;
+}
+
+/*
+STDC(199409)
+*/