summaryrefslogtreecommitdiff
path: root/src/wchar
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
parent6acf19370e8adff79cd83b257d3f04aeaf2a59dd (diff)
merge sources into single tree
Diffstat (limited to 'src/wchar')
-rw-r--r--src/wchar/FILE.ref3
-rw-r--r--src/wchar/NULL.ref3
-rw-r--r--src/wchar/WCHAR_MAX.c6
-rw-r--r--src/wchar/WCHAR_MIN.c6
-rw-r--r--src/wchar/WEOF.ref3
-rw-r--r--src/wchar/btowc.c21
-rw-r--r--src/wchar/fgetwc.c35
-rw-r--r--src/wchar/fgetws.c37
-rw-r--r--src/wchar/fputwc.c41
-rw-r--r--src/wchar/fputws.c12
-rw-r--r--src/wchar/fwide.c18
-rw-r--r--src/wchar/fwprintf.c16
-rw-r--r--src/wchar/fwscanf.c20
-rw-r--r--src/wchar/getwc.c11
-rw-r--r--src/wchar/getwchar.c11
-rw-r--r--src/wchar/mbrlen.c11
-rw-r--r--src/wchar/mbrtowc.c19
-rw-r--r--src/wchar/mbsinit.c14
-rw-r--r--src/wchar/mbsrtowcs.c11
-rw-r--r--src/wchar/mbstate_t.c6
-rw-r--r--src/wchar/putwc.c11
-rw-r--r--src/wchar/putwchar.c11
-rw-r--r--src/wchar/size_t.ref3
-rw-r--r--src/wchar/struct_tm.c6
-rw-r--r--src/wchar/swprintf.c15
-rw-r--r--src/wchar/swscanf.c19
-rw-r--r--src/wchar/ungetwc.c12
-rw-r--r--src/wchar/va_list.ref3
-rw-r--r--src/wchar/vfwprintf.c25
-rw-r--r--src/wchar/vfwscanf.c10
-rw-r--r--src/wchar/vswprintf.c12
-rw-r--r--src/wchar/vswscanf.c9
-rw-r--r--src/wchar/vwprintf.c11
-rw-r--r--src/wchar/vwscanf.c11
-rw-r--r--src/wchar/wchar_t.ref3
-rw-r--r--src/wchar/wcrtomb.c19
-rw-r--r--src/wchar/wcscat.c11
-rw-r--r--src/wchar/wcschr.c17
-rw-r--r--src/wchar/wcscmp.c25
-rw-r--r--src/wchar/wcscoll.c15
-rw-r--r--src/wchar/wcscpy.c10
-rw-r--r--src/wchar/wcscspn.c21
-rw-r--r--src/wchar/wcsftime.c11
-rw-r--r--src/wchar/wcslen.c14
-rw-r--r--src/wchar/wcsncat.c12
-rw-r--r--src/wchar/wcsncmp.c24
-rw-r--r--src/wchar/wcsncpy.c18
-rw-r--r--src/wchar/wcspbrk.c17
-rw-r--r--src/wchar/wcsrchr.c17
-rw-r--r--src/wchar/wcsrtombs.c11
-rw-r--r--src/wchar/wcsspn.c17
-rw-r--r--src/wchar/wcsstr.c11
-rw-r--r--src/wchar/wcstod.c11
-rw-r--r--src/wchar/wcstof.c9
-rw-r--r--src/wchar/wcstok.c11
-rw-r--r--src/wchar/wcstol.c11
-rw-r--r--src/wchar/wcstold.c9
-rw-r--r--src/wchar/wcstoll.c9
-rw-r--r--src/wchar/wcstoul.c11
-rw-r--r--src/wchar/wcstoull.c9
-rw-r--r--src/wchar/wcsxfrm.c11
-rw-r--r--src/wchar/wctob.c22
-rw-r--r--src/wchar/wint_t.ref3
-rw-r--r--src/wchar/wmemchr.c21
-rw-r--r--src/wchar/wmemcmp.c20
-rw-r--r--src/wchar/wmemcpy.c14
-rw-r--r--src/wchar/wmemmove.c15
-rw-r--r--src/wchar/wmemset.c14
-rw-r--r--src/wchar/wprintf.c15
-rw-r--r--src/wchar/wscanf.c19
70 files changed, 969 insertions, 0 deletions
diff --git a/src/wchar/FILE.ref b/src/wchar/FILE.ref
new file mode 100644
index 00000000..5d9aa059
--- /dev/null
+++ b/src/wchar/FILE.ref
@@ -0,0 +1,3 @@
+#include <wchar.h>
+REFERENCE(stdio/FILE.c)
+STDC(199409)
diff --git a/src/wchar/NULL.ref b/src/wchar/NULL.ref
new file mode 100644
index 00000000..251fc86a
--- /dev/null
+++ b/src/wchar/NULL.ref
@@ -0,0 +1,3 @@
+#include <wchar.h>
+REFERENCE(stddef/NULL.c)
+STDC(199409)
diff --git a/src/wchar/WCHAR_MAX.c b/src/wchar/WCHAR_MAX.c
new file mode 100644
index 00000000..de021945
--- /dev/null
+++ b/src/wchar/WCHAR_MAX.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+#define WCHAR_MAX (0x1FFFF)
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/WCHAR_MIN.c b/src/wchar/WCHAR_MIN.c
new file mode 100644
index 00000000..dbf961db
--- /dev/null
+++ b/src/wchar/WCHAR_MIN.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+#define WCHAR_MIN (0)
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/WEOF.ref b/src/wchar/WEOF.ref
new file mode 100644
index 00000000..e8aa99f1
--- /dev/null
+++ b/src/wchar/WEOF.ref
@@ -0,0 +1,3 @@
+#include <wchar.h>
+REFERENCE(wctype/WEOF.c)
+STDC(199409)
diff --git a/src/wchar/btowc.c b/src/wchar/btowc.c
new file mode 100644
index 00000000..dd986119
--- /dev/null
+++ b/src/wchar/btowc.c
@@ -0,0 +1,21 @@
+#include <wchar.h>
+#include "locale.h"
+#include "string.h"
+
+wint_t btowc(int c)
+{
+ char *l = setlocale(LC_CTYPE, NULL);
+
+ if (!strcmp(l, "C") || !strcmp(l, "POSIX")) {
+ if (c <= 127) {
+ return (unsigned char)c;
+ }
+ }
+
+ /* conversion */
+ return WEOF;
+}
+
+/*
+STDC(199409)
+*/
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)
+*/
diff --git a/src/wchar/fgetws.c b/src/wchar/fgetws.c
new file mode 100644
index 00000000..5262a79d
--- /dev/null
+++ b/src/wchar/fgetws.c
@@ -0,0 +1,37 @@
+#include <wchar.h>
+#include "stdio.h"
+#include "nonstd/assert.h"
+
+wchar_t * fgetws(wchar_t * restrict s, int n, FILE * restrict stream)
+{
+ ASSERT_NONNULL(s);
+ ASSERT_NONNULL(stream);
+
+ if (fwide(stream, 1) <= 0) {
+ /* not a wide stream */
+ return NULL;
+ }
+
+ int i;
+ for (i = 0; i < n; i++) {
+ s[i] = fgetwc(stream);
+ if (s[i] == WEOF) {
+ if (feof(stream)) {
+ s[i] = L'\0';
+ return s;
+ }
+ /* read or encoding error */
+ return NULL;
+ }
+ if (s[i] == L'\0') {
+ break;
+ }
+ }
+ s[i] = L'\0';
+
+ return s;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/fputwc.c b/src/wchar/fputwc.c
new file mode 100644
index 00000000..e7b9c503
--- /dev/null
+++ b/src/wchar/fputwc.c
@@ -0,0 +1,41 @@
+#include <wchar.h>
+#include "stdio.h"
+#include "nonstd/io.h"
+#include "limits.h"
+#include "errno.h"
+
+wint_t fputwc(wchar_t c, FILE * stream)
+{
+ size_t i;
+
+ if (fwide(stream, 1) <= 0) {
+ /* not a wide stream */
+ return WEOF;
+ }
+
+ flockfile(stream);
+ stream->orientation = -1;
+
+ char mbs[MB_LEN_MAX+1] = {0};
+ mbstate_t ps = 0;
+ size_t len = wcrtomb(mbs, c, &ps);
+
+ if (len == (size_t)-1) {
+ errno = EILSEQ;
+ return WEOF;
+ }
+
+ /* FIXME: check for errors here */
+ for (i = 0; i < len; i++) {
+ fputc(mbs[i], stream);
+ }
+
+ stream->orientation = 1;
+ funlockfile(stream);
+
+ return c;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/fputws.c b/src/wchar/fputws.c
new file mode 100644
index 00000000..69c0aec3
--- /dev/null
+++ b/src/wchar/fputws.c
@@ -0,0 +1,12 @@
+#include <wchar.h>
+#include "stdio.h"
+
+int fputws(const wchar_t * restrict s, FILE * restrict stream)
+{
+ (void)s; (void)stream;
+ return -1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/fwide.c b/src/wchar/fwide.c
new file mode 100644
index 00000000..a1401a42
--- /dev/null
+++ b/src/wchar/fwide.c
@@ -0,0 +1,18 @@
+#include <wchar.h>
+#include "stdio.h"
+#include "nonstd/io.h"
+#include "nonstd/assert.h"
+
+int fwide(FILE * stream, int mode)
+{
+ ASSERT_NONNULL(stream);
+
+ if (stream->orientation == 0) {
+ stream->orientation = mode;
+ }
+ return stream->orientation;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/fwprintf.c b/src/wchar/fwprintf.c
new file mode 100644
index 00000000..540405f9
--- /dev/null
+++ b/src/wchar/fwprintf.c
@@ -0,0 +1,16 @@
+#include <wchar.h>
+#include "stdio.h"
+#include "stdarg.h"
+
+int fwprintf(FILE * restrict stream, const wchar_t * restrict format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ int ret = vfwprintf(stream, format, ap);
+ va_end(ap);
+ return ret;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/fwscanf.c b/src/wchar/fwscanf.c
new file mode 100644
index 00000000..63324366
--- /dev/null
+++ b/src/wchar/fwscanf.c
@@ -0,0 +1,20 @@
+#include <wchar.h>
+#include "stdio.h"
+#include "stdarg.h"
+
+int fwscanf(FILE * restrict stream, const wchar_t * restrict format, ...)
+{
+ /*
+ va_list ap;
+ va_start(ap, format);
+ int ret = vfwscanf(stream, format, ap);
+ va_end(ap);
+ return ret;
+ */
+ (void)stream; (void)format;
+ return -1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/getwc.c b/src/wchar/getwc.c
new file mode 100644
index 00000000..6783e93c
--- /dev/null
+++ b/src/wchar/getwc.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+#include "stdio.h"
+
+wint_t getwc(FILE * stream)
+{
+ return fgetwc(stream);
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/getwchar.c b/src/wchar/getwchar.c
new file mode 100644
index 00000000..8d4efa06
--- /dev/null
+++ b/src/wchar/getwchar.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+#include "stdio.h"
+
+wint_t getwchar(void)
+{
+ return getwc(stdin);
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/mbrlen.c b/src/wchar/mbrlen.c
new file mode 100644
index 00000000..dd0af70b
--- /dev/null
+++ b/src/wchar/mbrlen.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+size_t mbrlen(const char * restrict s, size_t n, mbstate_t * restrict ps)
+{
+ static mbstate_t internal = 0;
+ return mbrtowc(NULL, s, n, ps != NULL ? ps : &internal);
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/mbrtowc.c b/src/wchar/mbrtowc.c
new file mode 100644
index 00000000..f6795d7f
--- /dev/null
+++ b/src/wchar/mbrtowc.c
@@ -0,0 +1,19 @@
+#include <wchar.h>
+
+size_t mbrtowc(wchar_t * restrict pwc, const char * restrict s, size_t n, mbstate_t * restrict ps)
+{
+ (void)ps; (void)pwc; (void)n;
+
+ if (s == NULL) {
+ s = "";
+ n = 1;
+ }
+
+ /* TODO */
+
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/mbsinit.c b/src/wchar/mbsinit.c
new file mode 100644
index 00000000..f3d7b44f
--- /dev/null
+++ b/src/wchar/mbsinit.c
@@ -0,0 +1,14 @@
+#include <wchar.h>
+
+int mbsinit(const mbstate_t * ps)
+{
+ if (ps == NULL || *ps == 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/mbsrtowcs.c b/src/wchar/mbsrtowcs.c
new file mode 100644
index 00000000..12f5e6a1
--- /dev/null
+++ b/src/wchar/mbsrtowcs.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+size_t mbsrtowcs(wchar_t * restrict dst, const char * restrict src, size_t len, mbstate_t * restrict ps)
+{
+ (void)dst; (void)src; (void)len; (void)ps;
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/mbstate_t.c b/src/wchar/mbstate_t.c
new file mode 100644
index 00000000..d29ecfa5
--- /dev/null
+++ b/src/wchar/mbstate_t.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+typedef int mbstate_t;
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/putwc.c b/src/wchar/putwc.c
new file mode 100644
index 00000000..58154c49
--- /dev/null
+++ b/src/wchar/putwc.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+#include "stdio.h"
+
+wint_t putwc(wchar_t c, FILE * stream)
+{
+ return fputwc(c, stream);
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/putwchar.c b/src/wchar/putwchar.c
new file mode 100644
index 00000000..291c45e9
--- /dev/null
+++ b/src/wchar/putwchar.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+#include "stdio.h"
+
+wint_t putwchar(wchar_t c)
+{
+ return putwc(c, stdout);
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/size_t.ref b/src/wchar/size_t.ref
new file mode 100644
index 00000000..a5058ebc
--- /dev/null
+++ b/src/wchar/size_t.ref
@@ -0,0 +1,3 @@
+#include <wchar.h>
+REFERENCE(stddef/size_t.c)
+STDC(199409)
diff --git a/src/wchar/struct_tm.c b/src/wchar/struct_tm.c
new file mode 100644
index 00000000..a33f964c
--- /dev/null
+++ b/src/wchar/struct_tm.c
@@ -0,0 +1,6 @@
+#include <wchar.h>
+struct tm;
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/swprintf.c b/src/wchar/swprintf.c
new file mode 100644
index 00000000..1b9ef406
--- /dev/null
+++ b/src/wchar/swprintf.c
@@ -0,0 +1,15 @@
+#include <wchar.h>
+#include "stdarg.h"
+
+int swprintf(wchar_t * restrict s, size_t n, const wchar_t * restrict format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ int ret = vswprintf(s, n, format, ap);
+ va_end(ap);
+ return ret;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/swscanf.c b/src/wchar/swscanf.c
new file mode 100644
index 00000000..2f10842a
--- /dev/null
+++ b/src/wchar/swscanf.c
@@ -0,0 +1,19 @@
+#include <wchar.h>
+#include "stdarg.h"
+
+int swscanf(const wchar_t * restrict s, const wchar_t * restrict format, ...)
+{
+ /*
+ va_list ap;
+ va_start(ap, format);
+ int ret = vswscanf(s, format, ap);
+ va_end(ap);
+ return ret;
+ */
+ (void)s; (void)format;
+ return -1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/ungetwc.c b/src/wchar/ungetwc.c
new file mode 100644
index 00000000..7c40ddb5
--- /dev/null
+++ b/src/wchar/ungetwc.c
@@ -0,0 +1,12 @@
+#include <wchar.h>
+#include "stdio.h"
+
+wint_t ungetwc(wint_t c, FILE * stream)
+{
+ (void)c; (void)stream;
+ return -1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/va_list.ref b/src/wchar/va_list.ref
new file mode 100644
index 00000000..ead1b4e1
--- /dev/null
+++ b/src/wchar/va_list.ref
@@ -0,0 +1,3 @@
+#include <wchar.h>
+REFERENCE(stdarg/va_list.c)
+STDC(199409)
diff --git a/src/wchar/vfwprintf.c b/src/wchar/vfwprintf.c
new file mode 100644
index 00000000..fbff917f
--- /dev/null
+++ b/src/wchar/vfwprintf.c
@@ -0,0 +1,25 @@
+#include <wchar.h>
+#include "stdio.h"
+#include "stdarg.h"
+#include "stdlib.h"
+
+int vfwprintf(FILE * restrict stream, const wchar_t * restrict format, va_list arg)
+{
+ /*
+ va_list ap;
+ va_copy(ap, arg);
+ int len = vsnwprintf(NULL, 0, format, arg);
+ wchar_t *buf = malloc((len + 1) * sizeof(wchar_t));
+ len = vsnwprintf(buf, len, format, ap);
+ va_end(ap);
+ len = (int)fwrite(buf, sizeof(*buf), len, stream);
+ free(buf);
+ return len;
+ */
+ (void)stream; (void)format; (void)arg;
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/vfwscanf.c b/src/wchar/vfwscanf.c
new file mode 100644
index 00000000..75451ac6
--- /dev/null
+++ b/src/wchar/vfwscanf.c
@@ -0,0 +1,10 @@
+#include "stdio.h"
+#include <wchar.h>
+
+int vfwscanf(FILE * restrict stream, const wchar_t * restrict format, va_list arg)
+{
+}
+
+/*
+STDC(199901)
+*/
diff --git a/src/wchar/vswprintf.c b/src/wchar/vswprintf.c
new file mode 100644
index 00000000..63169a59
--- /dev/null
+++ b/src/wchar/vswprintf.c
@@ -0,0 +1,12 @@
+#include "stdarg.h"
+#include <wchar.h>
+
+int vswprintf(wchar_t * restrict s, size_t n, const wchar_t * restrict format, va_list arg)
+{
+ (void)s; (void)n; (void)format; (void)arg;
+ return -1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/vswscanf.c b/src/wchar/vswscanf.c
new file mode 100644
index 00000000..b0896b75
--- /dev/null
+++ b/src/wchar/vswscanf.c
@@ -0,0 +1,9 @@
+#include <wchar.h>
+
+int vswscanf(const wchar_t * restrict s, const wchar_t * restrict format, va_list arg)
+{
+}
+
+/*
+STDC(199901)
+*/
diff --git a/src/wchar/vwprintf.c b/src/wchar/vwprintf.c
new file mode 100644
index 00000000..1f983489
--- /dev/null
+++ b/src/wchar/vwprintf.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+#include "stdio.h"
+
+int vwprintf(const wchar_t * restrict format, va_list arg)
+{
+ return vfwprintf(stdout, format, arg);
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/vwscanf.c b/src/wchar/vwscanf.c
new file mode 100644
index 00000000..757224a4
--- /dev/null
+++ b/src/wchar/vwscanf.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+#include "stdarg.h"
+
+int vwscanf(const wchar_t * restrict format, va_list arg)
+{
+ return vfwscanf(stdin, format, arg);
+}
+
+/*
+STDC(199901)
+*/
diff --git a/src/wchar/wchar_t.ref b/src/wchar/wchar_t.ref
new file mode 100644
index 00000000..7fef322e
--- /dev/null
+++ b/src/wchar/wchar_t.ref
@@ -0,0 +1,3 @@
+#include <wchar.h>
+REFERENCE(stddef/wchar_t.c)
+STDC(199409)
diff --git a/src/wchar/wcrtomb.c b/src/wchar/wcrtomb.c
new file mode 100644
index 00000000..f68c2177
--- /dev/null
+++ b/src/wchar/wcrtomb.c
@@ -0,0 +1,19 @@
+#include <wchar.h>
+#include "limits.h"
+
+size_t wcrtomb(char * restrict s, wchar_t wc, mbstate_t * restrict ps)
+{
+ char buf[MB_LEN_MAX+1];
+ if (s == NULL) {
+ s = buf;
+ wc = L'\0';
+ }
+ (void)wc; (void)ps;
+
+ /* do stuff */
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcscat.c b/src/wchar/wcscat.c
new file mode 100644
index 00000000..8ffec24f
--- /dev/null
+++ b/src/wchar/wcscat.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+wchar_t * wcscat(wchar_t * restrict s1, const wchar_t * restrict s2)
+{
+ wcscpy(s1 + wcslen(s1), s2);
+ return s1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcschr.c b/src/wchar/wcschr.c
new file mode 100644
index 00000000..cc206ed8
--- /dev/null
+++ b/src/wchar/wcschr.c
@@ -0,0 +1,17 @@
+#include <wchar.h>
+
+wchar_t * wcschr(const wchar_t * s, wchar_t c)
+{
+ while (*s) {
+ if (*s == c) {
+ return (wchar_t*) s;
+ }
+ s++;
+ }
+
+ return NULL;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcscmp.c b/src/wchar/wcscmp.c
new file mode 100644
index 00000000..d07d9a10
--- /dev/null
+++ b/src/wchar/wcscmp.c
@@ -0,0 +1,25 @@
+#include <wchar.h>
+#include "nonstd/assert.h"
+
+int wcscmp(const wchar_t * s1, const wchar_t * s2)
+{
+ ASSERT_NONNULL(s1);
+ ASSERT_NONNULL(s2);
+
+ while (*s1 == *s2 && *s1 != L'\0') {
+ s1++;
+ s2++;
+ }
+
+ if (*s1 > *s2) {
+ return 1;
+ } else if (*s1 < *s2) {
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcscoll.c b/src/wchar/wcscoll.c
new file mode 100644
index 00000000..097a2cc4
--- /dev/null
+++ b/src/wchar/wcscoll.c
@@ -0,0 +1,15 @@
+#include <wchar.h>
+
+int wcscoll(const wchar_t * s1, const wchar_t * s2)
+{
+ /*
+ wchar_t *collated_s1 = s1;
+ wchar_t *collated_s2 = s2;
+ */
+ /* wcsxfrm */
+ return wcscmp(s1, s2);
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcscpy.c b/src/wchar/wcscpy.c
new file mode 100644
index 00000000..2f92bc3f
--- /dev/null
+++ b/src/wchar/wcscpy.c
@@ -0,0 +1,10 @@
+#include <wchar.h>
+
+wchar_t * wcscpy(wchar_t * restrict s1, const wchar_t * restrict s2)
+{
+ return wcsncpy(s1, s2, wcslen(s2));
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcscspn.c b/src/wchar/wcscspn.c
new file mode 100644
index 00000000..0c300a4a
--- /dev/null
+++ b/src/wchar/wcscspn.c
@@ -0,0 +1,21 @@
+#include <wchar.h>
+#include "nonstd/assert.h"
+
+size_t wcscspn(const wchar_t * s1, const wchar_t * s2)
+{
+ size_t i;
+
+ ASSERT_NONNULL(s1);
+ ASSERT_NONNULL(s2);
+
+ for (i = 0; s1[i] != L'\0'; i++) {
+ if (s1[i] == L'\0' || wcschr(s2, s1[i]) == NULL) {
+ return i;
+ }
+ }
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsftime.c b/src/wchar/wcsftime.c
new file mode 100644
index 00000000..ddca082d
--- /dev/null
+++ b/src/wchar/wcsftime.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+size_t wcsftime(wchar_t * restrict s, size_t maxsize, const wchar_t * restrict format, const struct tm * restrict timeptr)
+{
+ (void)s; (void)maxsize; (void)format; (void)timeptr;
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcslen.c b/src/wchar/wcslen.c
new file mode 100644
index 00000000..5b4ec7be
--- /dev/null
+++ b/src/wchar/wcslen.c
@@ -0,0 +1,14 @@
+#include <wchar.h>
+
+size_t wcslen(const wchar_t * s)
+{
+ size_t l = 0;
+ while (s[l] != L'\0') {
+ l++;
+ }
+ return l;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsncat.c b/src/wchar/wcsncat.c
new file mode 100644
index 00000000..8dccba65
--- /dev/null
+++ b/src/wchar/wcsncat.c
@@ -0,0 +1,12 @@
+#include <wchar.h>
+
+wchar_t * wcsncat(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n)
+{
+ wcsncpy(s1 + wcslen(s1), s2, n);
+ /* ensure trailing nul */
+ return s1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsncmp.c b/src/wchar/wcsncmp.c
new file mode 100644
index 00000000..d41899f4
--- /dev/null
+++ b/src/wchar/wcsncmp.c
@@ -0,0 +1,24 @@
+#include <wchar.h>
+#include "nonstd/assert.h"
+
+int wcsncmp(const wchar_t * s1, const wchar_t * s2, size_t n)
+{
+ size_t i;
+
+ ASSERT_NONNULL(s1);
+ ASSERT_NONNULL(s2);
+
+ for (i = 0; i < n; i++) {
+ if (s1[i] > s2[i]) {
+ return 1;
+ } else if (s1[i] < s2[i]) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsncpy.c b/src/wchar/wcsncpy.c
new file mode 100644
index 00000000..ebae8133
--- /dev/null
+++ b/src/wchar/wcsncpy.c
@@ -0,0 +1,18 @@
+#include <wchar.h>
+
+wchar_t * wcsncpy(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n)
+{
+ size_t i;
+ int nul = 0;
+ for (i = 0; i < n; i++) {
+ s1[i] = nul ? s2[i] : L'\0';
+ if (s1[i] == L'\0') {
+ nul = 1;
+ }
+ }
+ return s1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcspbrk.c b/src/wchar/wcspbrk.c
new file mode 100644
index 00000000..d1553fd1
--- /dev/null
+++ b/src/wchar/wcspbrk.c
@@ -0,0 +1,17 @@
+#include <wchar.h>
+
+wchar_t * wcspbrk(const wchar_t * s1, const wchar_t * s2)
+{
+ int i;
+ for (i = 0; s1[i] != L'\0'; i++) {
+ if (wcschr(s2, s1[i]) != NULL) {
+ return (wchar_t*)s1 + i;
+ }
+ }
+
+ return NULL;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsrchr.c b/src/wchar/wcsrchr.c
new file mode 100644
index 00000000..291dc6f4
--- /dev/null
+++ b/src/wchar/wcsrchr.c
@@ -0,0 +1,17 @@
+#include <wchar.h>
+
+wchar_t * wcsrchr(const wchar_t * s, wchar_t c)
+{
+ wchar_t *last = NULL;
+ while (*s) {
+ if (*s == c) {
+ last = (wchar_t*)s;
+ }
+ s++;
+ }
+ return last;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsrtombs.c b/src/wchar/wcsrtombs.c
new file mode 100644
index 00000000..8df0bedf
--- /dev/null
+++ b/src/wchar/wcsrtombs.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+size_t wcsrtombs(char * restrict dst, const wchar_t ** restrict src, size_t len, mbstate_t * restrict ps)
+{
+ (void)dst; (void)src; (void)len; (void)ps;
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsspn.c b/src/wchar/wcsspn.c
new file mode 100644
index 00000000..50cd0e02
--- /dev/null
+++ b/src/wchar/wcsspn.c
@@ -0,0 +1,17 @@
+#include <wchar.h>
+
+size_t wcsspn(const wchar_t * s1, const wchar_t * s2)
+{
+ size_t i;
+ for (i = 0; s1[i] != L'\0'; i++) {
+ if (wcschr(s2, s1[i]) == NULL) {
+ return i;
+ }
+ }
+
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcsstr.c b/src/wchar/wcsstr.c
new file mode 100644
index 00000000..22cf9fa7
--- /dev/null
+++ b/src/wchar/wcsstr.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+wchar_t * wcsstr(const wchar_t * s1, const wchar_t * s2)
+{
+ (void)s2;
+ return (wchar_t*)s1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcstod.c b/src/wchar/wcstod.c
new file mode 100644
index 00000000..d8eeef74
--- /dev/null
+++ b/src/wchar/wcstod.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+double wcstod(const wchar_t * restrict nptr, wchar_t ** restrict endptr)
+{
+ (void)nptr; (void)endptr;
+ return 0.0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcstof.c b/src/wchar/wcstof.c
new file mode 100644
index 00000000..c9de199b
--- /dev/null
+++ b/src/wchar/wcstof.c
@@ -0,0 +1,9 @@
+#include <wchar.h>
+
+float wcstof(const wchar_t * restrict nptr, wchar_t ** restrict endptr)
+{
+}
+
+/*
+STDC(199901)
+*/
diff --git a/src/wchar/wcstok.c b/src/wchar/wcstok.c
new file mode 100644
index 00000000..0c40f5d9
--- /dev/null
+++ b/src/wchar/wcstok.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+wchar_t * wcstok(wchar_t * restrict s1, const wchar_t * restrict s2, wchar_t ** restrict ptr)
+{
+ (void)s1; (void)s2; (void)ptr;
+ return s1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcstol.c b/src/wchar/wcstol.c
new file mode 100644
index 00000000..5d4a605d
--- /dev/null
+++ b/src/wchar/wcstol.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+long int wcstol(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base)
+{
+ (void)nptr; (void)endptr; (void)base;
+ return 0L;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcstold.c b/src/wchar/wcstold.c
new file mode 100644
index 00000000..32001008
--- /dev/null
+++ b/src/wchar/wcstold.c
@@ -0,0 +1,9 @@
+#include <wchar.h>
+
+long double wcstold(const wchar_t * restrict nptr, wchar_t ** restrict endptr)
+{
+}
+
+/*
+STDC(199901)
+*/
diff --git a/src/wchar/wcstoll.c b/src/wchar/wcstoll.c
new file mode 100644
index 00000000..fc231433
--- /dev/null
+++ b/src/wchar/wcstoll.c
@@ -0,0 +1,9 @@
+#include <wchar.h>
+
+long long int wcstoll(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base)
+{
+}
+
+/*
+STDC(199901)
+*/
diff --git a/src/wchar/wcstoul.c b/src/wchar/wcstoul.c
new file mode 100644
index 00000000..8fcaeb8e
--- /dev/null
+++ b/src/wchar/wcstoul.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+unsigned long int wcstoul(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base)
+{
+ (void)nptr; (void)endptr; (void)base;
+ return 0UL;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wcstoull.c b/src/wchar/wcstoull.c
new file mode 100644
index 00000000..92e12e59
--- /dev/null
+++ b/src/wchar/wcstoull.c
@@ -0,0 +1,9 @@
+#include <wchar.h>
+
+unsigned long long int wcstoull(const wchar_t * restrict nptr, wchar_t ** restrict endptr, int base)
+{
+}
+
+/*
+STDC(199901)
+*/
diff --git a/src/wchar/wcsxfrm.c b/src/wchar/wcsxfrm.c
new file mode 100644
index 00000000..acc87510
--- /dev/null
+++ b/src/wchar/wcsxfrm.c
@@ -0,0 +1,11 @@
+#include <wchar.h>
+
+size_t wcsxfrm(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n)
+{
+ (void)s1; (void)s2; (void)n;
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wctob.c b/src/wchar/wctob.c
new file mode 100644
index 00000000..fb110e0b
--- /dev/null
+++ b/src/wchar/wctob.c
@@ -0,0 +1,22 @@
+#include <wchar.h>
+#include "locale.h"
+#include "string.h"
+#include "stdio.h"
+
+int wctob(wint_t c)
+{
+ char *l = setlocale(LC_CTYPE, NULL);
+
+ if (!strcmp(l, "C") || !strcmp(l, "POSIX")) {
+ if (c <= 127) {
+ return c;
+ }
+ }
+
+ /* conversion */
+ return EOF;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wint_t.ref b/src/wchar/wint_t.ref
new file mode 100644
index 00000000..387f9fa3
--- /dev/null
+++ b/src/wchar/wint_t.ref
@@ -0,0 +1,3 @@
+#include <wchar.h>
+REFERENCE(wctype/wint_t.c)
+STDC(199409)
diff --git a/src/wchar/wmemchr.c b/src/wchar/wmemchr.c
new file mode 100644
index 00000000..b6d9ac7b
--- /dev/null
+++ b/src/wchar/wmemchr.c
@@ -0,0 +1,21 @@
+#include <wchar.h>
+#include "nonstd/assert.h"
+
+wchar_t * wmemchr(const wchar_t * s, wchar_t c, size_t n)
+{
+ size_t i;
+
+ ASSERT_NONNULL(s);
+
+ for (i = 0; i < n; i++) {
+ if (s[i] == c) {
+ return (wchar_t*)s + i;
+ }
+ }
+
+ return NULL;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wmemcmp.c b/src/wchar/wmemcmp.c
new file mode 100644
index 00000000..d3c2ce52
--- /dev/null
+++ b/src/wchar/wmemcmp.c
@@ -0,0 +1,20 @@
+#include <wchar.h>
+
+int wmemcmp(const wchar_t * s1, const wchar_t * s2, size_t n)
+{
+ size_t i;
+
+ for (i = 0; i < n; i++) {
+ if (s1[i] > s2[i]) {
+ return 1;
+ } else if (s1[i] < s2[i]) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wmemcpy.c b/src/wchar/wmemcpy.c
new file mode 100644
index 00000000..0b583011
--- /dev/null
+++ b/src/wchar/wmemcpy.c
@@ -0,0 +1,14 @@
+#include <wchar.h>
+
+wchar_t * wmemcpy(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n)
+{
+ size_t i;
+ for (i = 0; i < n; i++) {
+ s1[i] = s2[i];
+ }
+ return s1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wmemmove.c b/src/wchar/wmemmove.c
new file mode 100644
index 00000000..11fd35dc
--- /dev/null
+++ b/src/wchar/wmemmove.c
@@ -0,0 +1,15 @@
+#include <wchar.h>
+#include "stdlib.h"
+
+wchar_t * wmemmove(wchar_t * s1, const wchar_t * s2, size_t n)
+{
+ wchar_t *tmp = malloc(n * sizeof(wchar_t));
+ wmemcpy(tmp, s2, n);
+ wmemcpy(s1, tmp, n);
+ free(tmp);
+ return s1;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wmemset.c b/src/wchar/wmemset.c
new file mode 100644
index 00000000..9b6ebe6d
--- /dev/null
+++ b/src/wchar/wmemset.c
@@ -0,0 +1,14 @@
+#include <wchar.h>
+
+wchar_t * wmemset(wchar_t * s, wchar_t c, size_t n)
+{
+ size_t i;
+ for (i = 0; i < n; i++) {
+ s[i] = c;
+ }
+ return s;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wprintf.c b/src/wchar/wprintf.c
new file mode 100644
index 00000000..9394e785
--- /dev/null
+++ b/src/wchar/wprintf.c
@@ -0,0 +1,15 @@
+#include <wchar.h>
+#include "stdarg.h"
+
+int wprintf(const wchar_t * restrict format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ int ret = vwprintf(format, ap);
+ va_end(ap);
+ return ret;
+}
+
+/*
+STDC(199409)
+*/
diff --git a/src/wchar/wscanf.c b/src/wchar/wscanf.c
new file mode 100644
index 00000000..abd74a33
--- /dev/null
+++ b/src/wchar/wscanf.c
@@ -0,0 +1,19 @@
+#include <wchar.h>
+#include "stdarg.h"
+
+int wscanf(const wchar_t * restrict format, ...)
+{
+ /*
+ va_list ap;
+ va_start(ap, format);
+ int ret = vwscanf(format, ap);
+ va_end(ap);
+ return ret;
+ */
+ (void)format;
+ return -1;
+}
+
+/*
+STDC(199409)
+*/