diff --git a/libc/stdlib/wchar.c b/libc/stdlib/wchar.c
new file mode 100644
index 0000000..d805333
--- /dev/null
+++ b/libc/stdlib/wchar.c
@@ -0,0 +1,438 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include <wchar.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* stubs for wide-char functions */
+wint_t  btowc(int c)
+{
+  return (c == EOF) ? WEOF : c;
+}
+
+int fwprintf(FILE *stream, const wchar_t *format, ...)
+{
+    va_list  args;
+    int      result;
+
+    va_start(args, format);
+    result = vfwprintf(stream, format, args);
+    va_end(args);
+    return result;
+}
+
+int wprintf(const wchar_t *format, ...)
+{
+    va_list  args;
+    int      result;
+
+    va_start(args, format);
+    result = vwprintf(format, args);
+    va_end(args);
+    return result;
+}
+
+int swprintf(wchar_t *s, size_t n, const wchar_t *format, ...)
+{
+    va_list  args;
+    int      result;
+
+    va_start(args, format);
+    result = vswprintf(s, n, format, args);
+    va_end(args);
+    return result;
+}
+
+int vwprintf(const wchar_t *format, va_list arg)
+{
+    return vprintf((const char*)format, arg);
+}
+
+int vfwprintf(FILE *stream, const wchar_t *format, va_list arg)
+{
+    return vfprintf(stream, (const char*)format, arg);
+}
+
+int vswprintf(wchar_t *s, size_t n, const wchar_t *format, va_list arg)
+{
+    return vsnprintf( (char*)s, n, (const char*)format, arg );
+}
+
+int fwscanf(FILE *stream, const wchar_t *format, ... )
+{
+    va_list  args;
+    int      result;
+
+    va_start (args, format);
+    result = vfscanf( stream, (const char*)format, args );
+    va_end (args);
+    return result;
+}
+
+int wscanf(const wchar_t *format, ... )
+{
+    va_list  args;
+    int      result;
+
+    va_start (args, format);
+    result = vscanf( (const char*)format, args );
+    va_end (args);
+    return result;
+}
+
+int swscanf(const wchar_t *s, const wchar_t *format, ... )
+{
+    va_list  args;
+    int      result;
+
+    va_start (args, format);
+    result = vscanf( (const char*)format, args );
+    va_end (args);
+    return result;
+}
+
+int iswalnum(wint_t wc) { return isalnum(wc); }
+int iswalpha(wint_t wc) { return isalpha(wc); }
+int iswcntrl(wint_t wc) { return iscntrl(wc); }
+int iswdigit(wint_t wc) { return isdigit(wc); }
+int iswgraph(wint_t wc) { return isgraph(wc); }
+int iswlower(wint_t wc) { return islower(wc); }
+int iswprint(wint_t wc) { return isprint(wc); }
+int iswpunct(wint_t wc) { return ispunct(wc); }
+int iswspace(wint_t wc) { return isspace(wc); }
+int iswupper(wint_t wc) { return isupper(wc); }
+int iswxdigit(wint_t wc) { return isxdigit(wc); }
+
+int iswctype(wint_t wc, wctype_t charclass)
+{
+    switch (charclass) {
+        case WC_TYPE_ALNUM: return isalnum(wc);
+        case WC_TYPE_ALPHA: return isalpha(wc);
+        case WC_TYPE_BLANK: return isblank(wc);
+        case WC_TYPE_CNTRL: return iscntrl(wc);
+        case WC_TYPE_DIGIT: return isdigit(wc);
+        case WC_TYPE_GRAPH: return isgraph(wc);
+        case WC_TYPE_LOWER: return islower(wc);
+        case WC_TYPE_PRINT: return isprint(wc);
+        case WC_TYPE_PUNCT: return ispunct(wc);
+        case WC_TYPE_SPACE: return isspace(wc);
+        case WC_TYPE_UPPER: return isupper(wc);
+        case WC_TYPE_XDIGIT: return isxdigit(wc);
+        default: return 0;
+    };
+}
+
+wint_t fgetwc(FILE *stream)
+{
+    return fgetc(stream);
+}
+
+wchar_t *fgetws(wchar_t *ws, int n, FILE *stream)
+{
+    return (wchar_t*) fgets((char*)ws, n, stream);
+}
+
+wint_t   fputwc(wchar_t wc, FILE *stream)
+{
+    return (wint_t)fputc((char)wc, stream);
+}
+
+int  fputws(const wchar_t *str, FILE *stream)
+{
+    return fputs( (const char*)str, stream );
+}
+
+int  fwide(FILE *stream, int  mode)
+{
+    stream=stream;
+    return (mode);
+}
+
+wint_t  getwc(FILE *stream)
+{
+    return getc(stream);
+}
+
+wint_t  getwchar(void)
+{
+    return getchar();
+}
+
+int mbsinit(const mbstate_t *ps)
+{
+    ps=ps;
+    return 1;
+}
+
+size_t mbrlen(const char *s, size_t n, mbstate_t *ps)
+{
+    return (n != 0);
+}
+
+size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+    if (s == NULL) {
+        s   = "";
+        pwc = NULL;
+    }
+    if (n == 0) {
+        if (pwc)
+            *pwc = 0;
+        return 0;
+    }
+    if (pwc)
+        *pwc = *s;
+
+    return (*s != 0);
+}
+
+size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps)
+{
+    const char*  s  = *src;
+    const char*  s2 = memchr( s, 0, len );
+
+    if (s2 != NULL)
+        len = (size_t)(s2 - s) + 1U;
+
+    if (dst)
+        memcpy( (char*)dst, s, len );
+
+    *src = s + len;
+    return len;
+}
+
+wint_t  putwc(wchar_t wc, FILE *stream)
+{
+    return fputc((char)wc, stream);
+}
+
+wint_t  putwchar(wchar_t wc)
+{
+    return  putchar((char)wc);
+}
+
+wint_t  towlower(wint_t wc)
+{
+    return tolower(wc);
+}
+
+wint_t  towupper(wint_t  wc)
+{
+    return toupper(wc);
+}
+
+wint_t  ungetwc(wint_t wc, FILE *stream)
+{
+    return ungetc((char)wc, stream);
+}
+
+size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps)
+{
+    if (s != NULL)
+        *s = 1;
+    return 1;
+}
+
+wchar_t *wcscat(wchar_t *ws1, const wchar_t *ws2)
+{
+    return (wchar_t*) strcat((char*)ws1, (const char*)ws2);
+}
+
+wchar_t *wcschr(const wchar_t *ws, wchar_t wc)
+{
+    return (wchar_t*)strchr( (const char*)ws, (char)wc );
+}
+
+int wcscmp(const wchar_t *ws1, const wchar_t *ws2)
+{
+    return strcmp( (const char*)ws1, (const char*)ws2 );
+}
+
+int wcscoll(const wchar_t *ws1, const wchar_t *ws2)
+{
+    return strcmp( (const char*)ws1, (const char*)ws2 );
+}
+
+wchar_t *wcscpy(wchar_t *ws1, const wchar_t *ws2)
+{
+    return (wchar_t*) strcpy( (char*)ws1, (const char*)ws2 );
+}
+
+size_t wcscspn(const wchar_t *ws1, const wchar_t *ws2)
+{
+    return strspn( (const char*)ws1, (const char*)ws2 );
+}
+
+size_t wcslen(const wchar_t *ws)
+{
+    return (size_t)strlen( (const char*)ws );
+}
+
+size_t wcsftime(wchar_t *wcs, size_t maxsize, const wchar_t *format,  const struct tm *timptr)
+{
+    return strftime( (char*)wcs, maxsize, (const char*)format, timptr );
+}
+
+wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n)
+{
+    return (wchar_t*) strncat( (char*)ws1, (const char*)ws2, n );
+}
+
+int wcsncmp(const wchar_t *ws1, const wchar_t *ws2, size_t n)
+{
+    return strncmp( (const char*)ws1, (const char*)ws2, n );
+}
+
+wchar_t *wcsncpy(wchar_t *ws1, const wchar_t *ws2, size_t n)
+{
+    return (wchar_t*) strncpy( (char*)ws1, (const char*)ws2, n );
+}
+
+wchar_t *wcspbrk(const wchar_t *ws1, const wchar_t *ws2)
+{
+    return (wchar_t*) strpbrk( (const char*)ws1, (const char*)ws2 );
+}
+
+wchar_t *wcsrchr(const wchar_t *ws, wchar_t wc)
+{
+    return (wchar_t*) strrchr( (const char*)ws, (int)wc );
+}
+
+size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps)
+{
+    const char*  s = (const char*)*src;
+    const char*  s2 = memchr( s, 0, len );
+
+    if (s2 != NULL)
+        len = (s2 - s)+1;
+
+    if (dst != NULL)
+        memcpy( dst, s, len );
+
+    *src = (wchar_t*)(s + len);
+    return len;
+}
+
+size_t wcsspn(const wchar_t *ws1, const wchar_t *ws2)
+{
+    return strspn( (const char*)ws1, (const char*)ws2 );
+}
+
+wchar_t *wcsstr(const wchar_t *ws1, const wchar_t *ws2)
+{
+    return (wchar_t*) strstr( (const char*)ws1, (const char*)ws2 );
+}
+
+double wcstod(const wchar_t *nptr, wchar_t **endptr)
+{
+    return strtod( (const char*)nptr, (char**)endptr );
+}
+
+wchar_t *wcstok(wchar_t *ws1, const wchar_t *ws2, wchar_t **ptr)
+{
+    return (wchar_t*) strtok_r( (char*)ws1, (const char*)ws2, (char**)ptr );
+}
+
+long int wcstol(const wchar_t *nptr, wchar_t **endptr, int base)
+{
+    return strtol( (const char*)nptr, (char**)endptr, base );
+}
+
+unsigned long int wcstoul(const wchar_t *nptr, wchar_t **endptr, int base)
+{
+    return strtoul( (const char*)nptr, (char**)endptr, base );
+}
+
+wchar_t *wcswcs(const wchar_t *ws1, const wchar_t *ws2)
+{
+    return (wchar_t*) strstr( (const char*)ws1, (const char*)ws2 );
+}
+
+int wcswidth(const wchar_t *pwcs, size_t n)
+{
+    return  strnlen( (const char*)pwcs, n );
+}
+
+size_t wcsxfrm(wchar_t *ws1, const wchar_t *ws2, size_t n)
+{
+    memcpy( (char*)ws1, (const char*)ws2, n );
+    return n;
+}
+
+int wctob(wint_t c)
+{
+  return c;
+}
+
+wctype_t wctype(const char *property)
+{
+    static const char* const  properties[WC_TYPE_MAX] =
+    {
+        "<invalid>",
+        "alnum", "alpha", "blank", "cntrl", "digit", "graph",
+        "lower", "print", "punct", "space", "upper", "xdigit"
+    };
+    int  nn;
+
+    for ( nn = 0; nn < WC_TYPE_MAX; nn++ )
+        if ( !strcmp( properties[nn], property ) )
+            return (wctype_t)(nn);
+
+    return 0;
+}
+
+int wcwidth(wchar_t wc)
+{
+    return (wc > 0);
+}
+
+wchar_t *wmemchr(const wchar_t *ws, wchar_t wc, size_t n)
+{
+    return (wchar_t*)  memchr( (const char*)ws, (int)wc, n );
+}
+
+int wmemcmp(const wchar_t *ws1, const wchar_t *ws2, size_t n)
+{
+    return  memcmp( (const char*)ws1, (const char*)ws2, n );
+}
+
+wchar_t *wmemcpy(wchar_t *ws1, const wchar_t *ws2, size_t n)
+{
+    return (wchar_t*) memcpy( (char*)ws1, (const char*)ws2, n );
+}
+
+wchar_t *wmemmove(wchar_t *ws1, const wchar_t *ws2, size_t n)
+{
+    return (wchar_t*)memmove( (char*)ws1, (const char*)ws2, n );
+}
+
+wchar_t *wmemset(wchar_t *ws, wchar_t wc, size_t n)
+{
+    return (wchar_t*) memset( (char*)ws, (int)wc, n );
+}
