[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/build/uClibc/libc/misc/wchar/Makefile b/ap/build/uClibc/libc/misc/wchar/Makefile
new file mode 100644
index 0000000..4a8f4a0
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/Makefile
@@ -0,0 +1,13 @@
+# Makefile for uClibc
+#
+# Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org>
+#
+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+#
+
+top_srcdir=../../../
+top_builddir=../../../
+all: objs
+include $(top_builddir)Rules.mak
+include Makefile.in
+include $(top_srcdir)Makerules
diff --git a/ap/build/uClibc/libc/misc/wchar/Makefile.in b/ap/build/uClibc/libc/misc/wchar/Makefile.in
new file mode 100644
index 0000000..be95a18
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/Makefile.in
@@ -0,0 +1,41 @@
+# Makefile for uClibc
+#
+# Copyright (C) 2000-2008 Erik Andersen <andersen@uclibc.org>
+#
+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+#
+
+# The stdio and time related wide functions are now built in the normal
+# directories.
+#
+# stdio:
+#	fwide fgetwc getwchar fgetws fputwc putwchar fputws ungetwc
+#	getwc (fgetwc alias) getwc_unlocked (fgetwc_unlocked alias)
+#	putwc (fputwc alias) putwc_unlocked (fputwc_unlocked alias)
+# time:
+# wcsftime
+#
+
+subdirs += libc/misc/wchar
+
+# multi source wchar.c
+CSRC :=	btowc.c wctob.c mbsinit.c mbrlen.c mbrtowc.c wcrtomb.c mbsrtowcs.c \
+	wcsrtombs.c _wchar_utf8sntowcs.c _wchar_wcsntoutf8s.c \
+	mbsnrtowcs.c wcsnrtombs.c wcwidth.c wcswidth.c
+
+ifeq ($(UCLIBC_HAS_LOCALE),y)
+CSRC += iconv.c
+endif
+
+MISC_WCHAR_DIR := $(top_srcdir)libc/misc/wchar
+MISC_WCHAR_OUT := $(top_builddir)libc/misc/wchar
+
+MISC_WCHAR_SRC := $(patsubst %.c,$(MISC_WCHAR_DIR)/%.c,$(CSRC))
+MISC_WCHAR_OBJ := $(patsubst %.c,$(MISC_WCHAR_OUT)/%.o,$(CSRC))
+
+libc-$(UCLIBC_HAS_WCHAR) += $(MISC_WCHAR_OBJ)
+
+objclean-y += CLEAN_libc/misc/wchar
+
+CLEAN_libc/misc/wchar:
+	$(do_rm) $(addprefix $(MISC_WCHAR_OUT)/*., o os)
diff --git a/ap/build/uClibc/libc/misc/wchar/_wchar_utf8sntowcs.c b/ap/build/uClibc/libc/misc/wchar/_wchar_utf8sntowcs.c
new file mode 100644
index 0000000..a01990e
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/_wchar_utf8sntowcs.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L__wchar_utf8sntowcs
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/_wchar_wcsntoutf8s.c b/ap/build/uClibc/libc/misc/wchar/_wchar_wcsntoutf8s.c
new file mode 100644
index 0000000..a63aa91
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/_wchar_wcsntoutf8s.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L__wchar_wcsntoutf8s
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/btowc.c b/ap/build/uClibc/libc/misc/wchar/btowc.c
new file mode 100644
index 0000000..d5e60ce
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/btowc.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_btowc
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/iconv.c b/ap/build/uClibc/libc/misc/wchar/iconv.c
new file mode 100644
index 0000000..e6e8ea8
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/iconv.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_iconv
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/mbrlen.c b/ap/build/uClibc/libc/misc/wchar/mbrlen.c
new file mode 100644
index 0000000..01bd31e
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/mbrlen.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_mbrlen
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/mbrtowc.c b/ap/build/uClibc/libc/misc/wchar/mbrtowc.c
new file mode 100644
index 0000000..76ce28a
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/mbrtowc.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_mbrtowc
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/mbsinit.c b/ap/build/uClibc/libc/misc/wchar/mbsinit.c
new file mode 100644
index 0000000..23aaac5
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/mbsinit.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_mbsinit
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/mbsnrtowcs.c b/ap/build/uClibc/libc/misc/wchar/mbsnrtowcs.c
new file mode 100644
index 0000000..9b407c1
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/mbsnrtowcs.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_mbsnrtowcs
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/mbsrtowcs.c b/ap/build/uClibc/libc/misc/wchar/mbsrtowcs.c
new file mode 100644
index 0000000..dd47a91
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/mbsrtowcs.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_mbsrtowcs
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/wchar.c b/ap/build/uClibc/libc/misc/wchar/wchar.c
new file mode 100644
index 0000000..412c557
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/wchar.c
@@ -0,0 +1,1565 @@
+
+/*  Copyright (C) 2002, 2003, 2004     Manuel Novoa III
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*  ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION!
+ *
+ *  Besides uClibc, I'm using this code in my libc for elks, which is
+ *  a 16-bit environment with a fairly limited compiler.  It would make
+ *  things much easier for me if this file isn't modified unnecessarily.
+ *  In particular, please put any new or replacement functions somewhere
+ *  else, and modify the makefile to use your version instead.
+ *  Thanks.  Manuel
+ *
+ *  ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION!   ATTENTION! */
+
+
+/* May 23, 2002     Initial Notes:
+ *
+ * I'm still tweaking this stuff, but it passes the tests I've thrown
+ * at it, and Erik needs it for the gcc port.  The glibc extension
+ * __wcsnrtombs() hasn't been tested, as I didn't find a test for it
+ * in the glibc source.  I also need to fix the behavior of
+ * _wchar_utf8sntowcs() if the max number of wchars to convert is 0.
+ *
+ * UTF-8 -> wchar -> UTF-8 conversion tests on Markus Kuhn's UTF-8-demo.txt
+ * file on my platform (x86) show about 5-10% faster conversion speed than
+ * glibc with mbsrtowcs()/wcsrtombs() and almost twice as fast as glibc with
+ * individual mbrtowc()/wcrtomb() calls.
+ *
+ * If 'DECODER' is defined, then _wchar_utf8sntowcs() will be compiled
+ * as a fail-safe UTF-8 decoder appropriate for a terminal, etc.  which
+ * needs to deal gracefully with whatever is sent to it.  In that mode,
+ * it passes Markus Kuhn's UTF-8-test.txt stress test.  I plan to add
+ * an arg to force that behavior, so the interface will be changing.
+ *
+ * I need to fix the error checking for 16-bit wide chars.  This isn't
+ * an issue for uClibc, but may be for ELKS.  I'm currently not sure
+ * if I'll use 16-bit, 32-bit, or configureable wchars in ELKS.
+ *
+ * July 1, 2002
+ *
+ * Fixed _wchar_utf8sntowcs() for the max number of wchars == 0 case.
+ * Fixed nul-char bug in btowc(), and another in __mbsnrtowcs() for 8-bit
+ *    locales.
+ * Enabled building of a C/POSIX-locale-only version, so full locale support
+ *    no longer needs to be enabled.
+ *
+ * Nov 4, 2002
+ *
+ * Fixed a bug in _wchar_wcsntoutf8s().  Don't store wcs position if dst is NULL.
+ * Also, introduce an awful hack into _wchar_wcsntoutf8s() and wcsrtombs() in
+ *   order to support %ls in printf.  See comments below for details.
+ * Change behaviour of wc<->mb functions when in the C locale.  Now they do
+ *   a 1-1 map for the range 0x80-UCHAR_MAX.  This is for backwards compatibility
+ *   and consistency with the stds requirements that a printf format string by
+ *   a valid multibyte string beginning and ending in it's initial shift state.
+ *
+ * Nov 5, 2002
+ *
+ * Forgot to change btowc and wctob when I changed the wc<->mb functions yesterday.
+ *
+ * Nov 7, 2002
+ *
+ * Add wcwidth and wcswidth, based on Markus Kuhn's wcwidth of 2002-05-08.
+ *   Added some size/speed optimizations and integrated it into my locale
+ *   framework.  Minimally tested at the moment, but the stub C-locale
+ *   version (which most people would probably be using) should be fine.
+ *
+ * Nov 21, 2002
+ *
+ * Revert the wc<->mb changes from earlier this month involving the C-locale.
+ * Add a couple of ugly hacks to support *wprintf.
+ * Add a mini iconv() and iconv implementation (requires locale support).
+ *
+ * Aug 1, 2003
+ * Bug fix for mbrtowc.
+ *
+ * Aug 18, 2003
+ * Bug fix: _wchar_utf8sntowcs and _wchar_wcsntoutf8s now set errno if EILSEQ.
+ *
+ * Feb 11, 2004
+ * Bug fix: Fix size check for remaining output space in iconv().
+ *
+ * Manuel
+ */
+#ifdef _LIBC
+#include <errno.h>
+#include <stddef.h>
+#include <limits.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <locale.h>
+#include <wchar.h>
+#include <bits/uClibc_uwchar.h>
+
+/**********************************************************************/
+#ifdef __UCLIBC_HAS_LOCALE__
+#ifdef __UCLIBC_MJN3_ONLY__
+#ifdef L_iswspace
+/* generates one warning */
+#warning TODO: Fix Cc2wc* and Cwc2c* defines!
+#endif
+#endif /* __UCLIBC_MJN3_ONLY__ */
+
+#define ENCODING		(__UCLIBC_CURLOCALE->encoding)
+
+#define Cc2wc_IDX_SHIFT		__LOCALE_DATA_Cc2wc_IDX_SHIFT
+#define Cc2wc_ROW_LEN		__LOCALE_DATA_Cc2wc_ROW_LEN
+#define Cwc2c_DOMAIN_MAX	__LOCALE_DATA_Cwc2c_DOMAIN_MAX
+#define Cwc2c_TI_SHIFT		__LOCALE_DATA_Cwc2c_TI_SHIFT
+#define Cwc2c_TT_SHIFT		__LOCALE_DATA_Cwc2c_TT_SHIFT
+#define Cwc2c_TI_LEN		__LOCALE_DATA_Cwc2c_TI_LEN
+
+#ifndef __CTYPE_HAS_UTF_8_LOCALES
+#warning __CTYPE_HAS_UTF_8_LOCALES not set!
+#endif
+
+#else  /* __UCLIBC_HAS_LOCALE__ */
+
+#ifdef __UCLIBC_MJN3_ONLY__
+#ifdef L_btowc
+/* emit only once */
+#warning fix preprocessor logic testing locale settings
+#endif
+#endif
+
+#define ENCODING (__ctype_encoding_7_bit)
+#ifdef __CTYPE_HAS_8_BIT_LOCALES
+#error __CTYPE_HAS_8_BIT_LOCALES is defined!
+#endif
+#ifdef __CTYPE_HAS_UTF_8_LOCALES
+#error __CTYPE_HAS_UTF_8_LOCALES is defined!
+#endif
+#undef L__wchar_utf8sntowcs
+#undef L__wchar_wcsntoutf8s
+
+#endif /* __UCLIBC_HAS_LOCALE__ */
+/**********************************************************************/
+
+#if WCHAR_MAX > 0xffffUL
+#define UTF_8_MAX_LEN 6
+#else
+#define UTF_8_MAX_LEN 3
+#endif
+
+#define KUHN 1
+
+/* Implementation-specific work functions. */
+
+extern size_t _wchar_utf8sntowcs(wchar_t *__restrict pwc, size_t wn,
+					const char **__restrict src, size_t n,
+					mbstate_t *ps, int allow_continuation) attribute_hidden;
+
+extern size_t _wchar_wcsntoutf8s(char *__restrict s, size_t n,
+					const wchar_t **__restrict src, size_t wn) attribute_hidden;
+#endif
+/**********************************************************************/
+#ifdef L_btowc
+
+
+wint_t btowc(int c)
+{
+#ifdef __CTYPE_HAS_8_BIT_LOCALES
+
+	wchar_t wc;
+	unsigned char buf[1];
+	mbstate_t mbstate;
+
+	if (c != EOF) {
+		*buf = (unsigned char) c;
+		mbstate.__mask = 0;		/* Initialize the mbstate. */
+		if (mbrtowc(&wc, (char*) buf, 1, &mbstate) <= 1) {
+			return wc;
+		}
+	}
+	return WEOF;
+
+#else  /* !__CTYPE_HAS_8_BIT_LOCALES */
+
+#ifdef __UCLIBC_HAS_LOCALE__
+	assert((ENCODING == __ctype_encoding_7_bit)
+		   || (ENCODING == __ctype_encoding_utf8));
+#endif
+
+	/* If we don't have 8-bit locale support, then this is trivial since
+	 * anything outside of 0-0x7f is illegal in C/POSIX and UTF-8 locales. */
+	return (((unsigned int)c) < 0x80) ? c : WEOF;
+
+#endif /* !__CTYPE_HAS_8_BIT_LOCALES */
+}
+libc_hidden_def(btowc)
+
+#endif
+/**********************************************************************/
+#ifdef L_wctob
+
+/* Note: We completely ignore ps in all currently supported conversions. */
+
+
+int wctob(wint_t c)
+{
+#ifdef __CTYPE_HAS_8_BIT_LOCALES
+
+	unsigned char buf[MB_LEN_MAX];
+
+	return (wcrtomb((char*) buf, c, NULL) == 1) ? *buf : EOF;
+
+#else  /*  __CTYPE_HAS_8_BIT_LOCALES */
+
+#ifdef __UCLIBC_HAS_LOCALE__
+	assert((ENCODING == __ctype_encoding_7_bit)
+		   || (ENCODING == __ctype_encoding_utf8));
+#endif /* __UCLIBC_HAS_LOCALE__ */
+
+	/* If we don't have 8-bit locale support, then this is trivial since
+	 * anything outside of 0-0x7f is illegal in C/POSIX and UTF-8 locales. */
+
+	/* TODO: need unsigned version of wint_t... */
+/*  	return (((unsigned int)c) < 0x80) ? c : WEOF; */
+	return ((c >= 0) && (c < 0x80)) ? c : EOF;
+
+#endif /*  __CTYPE_HAS_8_BIT_LOCALES */
+}
+
+#endif
+/**********************************************************************/
+#ifdef L_mbsinit
+
+int mbsinit(const mbstate_t *ps)
+{
+	return !ps || !ps->__mask;
+}
+libc_hidden_def(mbsinit)
+
+#endif
+/**********************************************************************/
+#ifdef L_mbrlen
+
+
+size_t mbrlen(const char *__restrict s, size_t n, mbstate_t *__restrict ps)
+{
+	static mbstate_t mbstate;	/* Rely on bss 0-init. */
+
+	return mbrtowc(NULL, s, n, (ps != NULL) ? ps : &mbstate);
+}
+libc_hidden_def(mbrlen)
+
+#endif
+/**********************************************************************/
+#ifdef L_mbrtowc
+
+
+size_t mbrtowc(wchar_t *__restrict pwc, const char *__restrict s,
+			   size_t n, mbstate_t *__restrict ps)
+{
+	static mbstate_t mbstate;	/* Rely on bss 0-init. */
+	wchar_t wcbuf[1];
+	const char *p;
+	size_t r;
+	char empty_string[1];		/* Avoid static to be fPIC friendly. */
+
+	if (!ps) {
+		ps = &mbstate;
+	}
+
+	if (!s) {
+		pwc = (wchar_t *) s;	/* NULL */
+		empty_string[0] = 0;	/* Init the empty string when necessary. */
+		s = empty_string;
+		n = 1;
+	} else if (*s == '\0') {
+		if (pwc)
+			*pwc = '\0';
+	/* According to the ISO C 89 standard this is the expected behaviour.  */
+		return 0;
+	} else if (!n) {
+		/* TODO: change error code? */
+#if 0
+		return (ps->__mask && (ps->__wc == 0xffffU))
+			? ((size_t) -1) : ((size_t) -2);
+#else
+		return 0;
+#endif
+	}
+
+	p = s;
+
+#ifdef __CTYPE_HAS_UTF_8_LOCALES
+	/* Need to do this here since mbsrtowcs doesn't allow incompletes. */
+	if (ENCODING == __ctype_encoding_utf8) {
+		if (!pwc) {
+			pwc = wcbuf;
+		}
+		r = _wchar_utf8sntowcs(pwc, 1, &p, n, ps, 1);
+		return (r == 1) ? (p-s) : r; /* Need to return 0 if nul char. */
+	}
+#endif
+
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning TODO: This adds a trailing nul!
+#endif /* __UCLIBC_MJN3_ONLY__ */
+
+	r = mbsnrtowcs(wcbuf, &p, SIZE_MAX, 1, ps);
+
+	if (((ssize_t) r) >= 0) {
+		if (pwc) {
+			*pwc = *wcbuf;
+		}
+	}
+	return (size_t) r;
+}
+libc_hidden_def(mbrtowc)
+
+#endif
+/**********************************************************************/
+#ifdef L_wcrtomb
+
+
+/* Note: We completely ignore ps in all currently supported conversions. */
+/* TODO: Check for valid state anyway? */
+
+size_t wcrtomb(register char *__restrict s, wchar_t wc,
+			   mbstate_t *__restrict ps)
+{
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning TODO: Should wcsnrtombs nul-terminate unconditionally?  Check glibc.
+#endif /* __UCLIBC_MJN3_ONLY__ */
+	wchar_t wcbuf[1];
+	const wchar_t *pwc;
+	size_t r;
+	char buf[MB_LEN_MAX];
+
+	if (!s) {
+		s = buf;
+		wc = 0;
+	}
+
+	pwc = wcbuf;
+	wcbuf[0] = wc;
+
+	r = wcsnrtombs(s, &pwc, 1, MB_LEN_MAX, ps);
+	return (r != 0) ? r : 1;
+}
+libc_hidden_def(wcrtomb)
+
+#endif
+/**********************************************************************/
+#ifdef L_mbsrtowcs
+
+
+size_t mbsrtowcs(wchar_t *__restrict dst, const char **__restrict src,
+				 size_t len, mbstate_t *__restrict ps)
+{
+	static mbstate_t mbstate;	/* Rely on bss 0-init. */
+
+	return mbsnrtowcs(dst, src, SIZE_MAX, len,
+						((ps != NULL) ? ps : &mbstate));
+}
+libc_hidden_def(mbsrtowcs)
+
+#endif
+/**********************************************************************/
+#ifdef L_wcsrtombs
+
+/* Note: We completely ignore ps in all currently supported conversions.
+
+ * TODO: Check for valid state anyway? */
+
+
+size_t wcsrtombs(char *__restrict dst, const wchar_t **__restrict src,
+				 size_t len, mbstate_t *__restrict ps)
+{
+	return wcsnrtombs(dst, src, SIZE_MAX, len, ps);
+}
+libc_hidden_def(wcsrtombs)
+
+#endif
+/**********************************************************************/
+#ifdef L__wchar_utf8sntowcs
+
+/* Define DECODER to generate a UTF-8 decoder which passes Markus Kuhn's
+ * UTF-8-test.txt strss test.
+ */
+/*  #define DECODER */
+
+#ifdef DECODER
+#ifndef KUHN
+#define KUHN
+#endif
+#endif
+
+size_t attribute_hidden _wchar_utf8sntowcs(wchar_t *__restrict pwc, size_t wn,
+						  const char **__restrict src, size_t n,
+						  mbstate_t *ps, int allow_continuation)
+{
+	register const char *s;
+	__uwchar_t mask;
+	__uwchar_t wc;
+	wchar_t wcbuf[1];
+	size_t count;
+	int incr;
+
+	s = *src;
+
+	assert(s != NULL);
+	assert(ps != NULL);
+
+	incr = 1;
+	/* NOTE: The following is an AWFUL HACK!  In order to support %s in
+	 * wprintf, we need to be able to compute the number of wchars needed
+	 * for the mbs conversion, not to exceed the precision specified.
+	 * But if dst is NULL, the return value is the length assuming a
+	 * sufficiently sized buffer.  So, we allow passing of (wchar_t *) ps
+	 * as pwc in order to flag that we really want the length, subject
+	 * to the restricted buffer size and no partial conversions.
+	 * See mbsnrtowcs() as well. */
+	if (!pwc || (pwc == ((wchar_t *)ps))) {
+		if (!pwc) {
+			wn = SIZE_MAX;
+		}
+		pwc = wcbuf;
+		incr = 0;
+	}
+
+	/* This is really here only to support the glibc extension function
+	 * __mbsnrtowcs which apparently returns 0 if wn == 0 without any
+	 * check on the validity of the mbstate. */
+	if (!(count = wn)) {
+		return 0;
+	}
+
+	if ((mask = (__uwchar_t) ps->__mask) != 0) { /* A continuation... */
+#ifdef DECODER
+		wc = (__uwchar_t) ps->__wc;
+		if (n) {
+			goto CONTINUE;
+		}
+		goto DONE;
+#else
+		if ((wc = (__uwchar_t) ps->__wc) != 0xffffU) {
+			/* TODO: change error code here and below? */
+			if (n) {
+				goto CONTINUE;
+			}
+			goto DONE;
+		}
+		__set_errno(EILSEQ);
+		return (size_t) -1;		/* We're in an error state. */
+#endif
+	}
+
+	do {
+		if (!n) {
+			goto DONE;
+		}
+		--n;
+		if ((wc = ((unsigned char) *s++)) >= 0x80) { /* Not ASCII... */
+			mask = 0x40;
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning TODO: Fix range for 16 bit wchar_t case.
+#endif
+			if (( ((unsigned char)(s[-1] - 0xc0)) < (0xfe - 0xc0) ) &&
+			(((unsigned char)s[-1] != 0xc0 ) && ((unsigned char)s[-1] != 0xc1 ))) {
+				goto START;
+			}
+		BAD:
+#ifdef DECODER
+			wc = 0xfffdU;
+			goto COMPLETE;
+#else
+			ps->__mask = mask;
+			ps->__wc = 0xffffU;
+			__set_errno(EILSEQ);
+			return (size_t) -1;	/* Illegal start byte! */
+#endif
+
+		CONTINUE:
+			while (n) {
+				--n;
+				if ((*s & 0xc0) != 0x80) {
+					goto BAD;
+				}
+				mask <<= 5;
+				wc <<= 6;
+				wc += (*s & 0x3f);	/* keep seperate for bcc (smaller code) */
+				++s;
+			START:
+				wc &= ~(mask << 1);
+
+				if ((wc & mask) == 0) {	/* Character completed. */
+					if ((mask >>= 5) == 0x40) {
+						mask += mask;
+					}
+					/* Check for invalid sequences (longer than necessary)
+					 * and invalid chars.  */
+					if ( (wc < mask) /* Sequence not minimal length. */
+#ifdef KUHN
+#if UTF_8_MAX_LEN == 3
+#error broken since mask can overflow!!
+						 /* For plane 0, these are the only defined values.*/
+						 || (wc > 0xfffdU)
+#else
+						 /* Note that we don't need to worry about exceeding */
+						 /* 31 bits as that is the most that UTF-8 provides. */
+						 || ( ((__uwchar_t)(wc - 0xfffeU)) < 2)
+#endif
+						 || ( ((__uwchar_t)(wc - 0xd800U)) < (0xe000U - 0xd800U) )
+#endif /* KUHN */
+						 ) {
+						goto BAD;
+					}
+					goto COMPLETE;
+				}
+			}
+			/* Character potentially valid but incomplete. */
+			if (!allow_continuation) {
+				if (count != wn) {
+					return 0;
+				}
+				/* NOTE: The following can fail if you allow and then disallow
+				 * continuation!!! */
+#if UTF_8_MAX_LEN == 3
+#error broken since mask can overflow!!
+#endif
+				/* Need to back up... */
+				do {
+					--s;
+				} while ((mask >>= 5) >= 0x40);
+				goto DONE;
+			}
+			ps->__mask = (wchar_t) mask;
+			ps->__wc = (wchar_t) wc;
+			*src = s;
+			return (size_t) -2;
+		}
+	COMPLETE:
+		*pwc = wc;
+		pwc += incr;
+	}
+#ifdef DECODER
+	while (--count);
+#else
+	while (wc && --count);
+
+	if (!wc) {
+		s = NULL;
+	}
+#endif
+
+ DONE:
+	/* ps->__wc is irrelavent here. */
+	ps->__mask = 0;
+	if (pwc != wcbuf) {
+		*src = s;
+	}
+
+	return wn - count;
+}
+
+#endif
+/**********************************************************************/
+#ifdef L__wchar_wcsntoutf8s
+
+size_t attribute_hidden _wchar_wcsntoutf8s(char *__restrict s, size_t n,
+						  const wchar_t **__restrict src, size_t wn)
+{
+	register char *p;
+	size_t len, t;
+	__uwchar_t wc;
+	const __uwchar_t *swc;
+	int store;
+	char buf[MB_LEN_MAX];
+	char m;
+
+	store = 1;
+	/* NOTE: The following is an AWFUL HACK!  In order to support %ls in
+	 * printf, we need to be able to compute the number of bytes needed
+	 * for the mbs conversion, not to exceed the precision specified.
+	 * But if dst is NULL, the return value is the length assuming a
+	 * sufficiently sized buffer.  So, we allow passing of (char *) src
+	 * as dst in order to flag that we really want the length, subject
+	 * to the restricted buffer size and no partial conversions.
+	 * See wcsnrtombs() as well. */
+	if (!s || (s == ((char *) src))) {
+		if (!s) {
+			n = SIZE_MAX;
+		}
+		s = buf;
+		store = 0;
+	}
+
+	t = n;
+	swc = (const __uwchar_t *) *src;
+
+	assert(swc != NULL);
+
+	while (wn && t) {
+		wc = *swc;
+
+		*s = wc;
+		len = 1;
+
+		if (wc >= 0x80) {
+#ifdef KUHN
+			if (
+#if UTF_8_MAX_LEN == 3
+				/* For plane 0, these are the only defined values.*/
+				/* Note that we don't need to worry about exceeding */
+				/* 31 bits as that is the most that UTF-8 provides. */
+				(wc > 0xfffdU)
+#else
+				/* UTF_8_MAX_LEN == 6 */
+				(wc > 0x7fffffffUL)
+				|| ( ((__uwchar_t)(wc - 0xfffeU)) < 2)
+#endif
+				|| ( ((__uwchar_t)(wc - 0xd800U)) < (0xe000U - 0xd800U) )
+				) {
+				__set_errno(EILSEQ);
+				return (size_t) -1;
+			}
+#else  /* KUHN */
+#if UTF_8_MAX_LEN != 3
+			if (wc > 0x7fffffffUL) { /* Value too large. */
+				__set_errno(EILSEQ);
+				return (size_t) -1;
+			}
+#endif
+#endif /* KUHN */
+
+			wc >>= 1;
+			p = s;
+			do {
+				++p;
+			} while (wc >>= 5);
+			wc = *swc;
+			if ((len = p - s) > t) { /* Not enough space. */
+				break;
+			}
+
+			m = 0x80;
+			while( p>s ) {
+				m = (m >> 1) | 0x80;
+				*--p = (wc & 0x3f) | 0x80;
+				wc >>= 6;
+			}
+			*s |= (m << 1);
+		} else if (wc == 0) {	/* End of string. */
+			swc = NULL;
+			break;
+		}
+
+		++swc;
+		--wn;
+		t -= len;
+		if (store) {
+			s += len;
+		}
+	}
+
+	if (store) {
+		*src = (const wchar_t *) swc;
+	}
+
+	return n - t;
+}
+
+
+#endif
+/**********************************************************************/
+#ifdef L_mbsnrtowcs
+
+/* WARNING: We treat len as SIZE_MAX when dst is NULL! */
+
+size_t mbsnrtowcs(wchar_t *__restrict dst, const char **__restrict src,
+					size_t NMC, size_t len, mbstate_t *__restrict ps)
+{
+	static mbstate_t mbstate;	/* Rely on bss 0-init. */
+	wchar_t wcbuf[1];
+	const char *s;
+	size_t count;
+	int incr;
+
+	if (!ps) {
+		ps = &mbstate;
+	}
+
+#ifdef __CTYPE_HAS_UTF_8_LOCALES
+	if (ENCODING == __ctype_encoding_utf8) {
+		size_t r;
+		return ((r = _wchar_utf8sntowcs(dst, len, src, NMC, ps, 1))
+				!= (size_t) -2) ? r : 0;
+	}
+#endif
+	incr = 1;
+	/* NOTE: The following is an AWFUL HACK!  In order to support %s in
+	 * wprintf, we need to be able to compute the number of wchars needed
+	 * for the mbs conversion, not to exceed the precision specified.
+	 * But if dst is NULL, the return value is the length assuming a
+	 * sufficiently sized buffer.  So, we allow passing of ((wchar_t *)ps)
+	 * as dst in order to flag that we really want the length, subject
+	 * to the restricted buffer size and no partial conversions.
+	 * See _wchar_utf8sntowcs() as well. */
+	if (!dst || (dst == ((wchar_t *)ps))) {
+		if (!dst) {
+			len = SIZE_MAX;
+		}
+		dst = wcbuf;
+		incr = 0;
+	}
+
+	/* Since all the following encodings are single-byte encodings... */
+	if (len > NMC) {
+		len = NMC;
+	}
+
+	count = len;
+	s = *src;
+
+#ifdef __CTYPE_HAS_8_BIT_LOCALES
+	if (ENCODING == __ctype_encoding_8_bit) {
+		wchar_t wc;
+		while (count) {
+			if ((wc = ((unsigned char)(*s))) >= 0x80) {	/* Non-ASCII... */
+				wc -= 0x80;
+				wc = __UCLIBC_CURLOCALE->tbl8c2wc[
+						  (__UCLIBC_CURLOCALE->idx8c2wc[wc >> Cc2wc_IDX_SHIFT]
+						   << Cc2wc_IDX_SHIFT) + (wc & (Cc2wc_ROW_LEN - 1))];
+				if (!wc) {
+					goto BAD;
+				}
+			}
+			if (!(*dst = wc)) {
+				s = NULL;
+				break;
+			}
+			dst += incr;
+			++s;
+			--count;
+		}
+		if (dst != wcbuf) {
+			*src = s;
+		}
+		return len - count;
+	}
+#endif
+
+#ifdef __UCLIBC_HAS_LOCALE__
+	assert(ENCODING == __ctype_encoding_7_bit);
+#endif
+
+	while (count) {
+		if ((*dst = (unsigned char) *s) == 0) {
+			s = NULL;
+			break;
+		}
+		if (*dst >= 0x80) {
+#ifdef __CTYPE_HAS_8_BIT_LOCALES
+		BAD:
+#endif
+			__set_errno(EILSEQ);
+			return (size_t) -1;
+		}
+		++s;
+		dst += incr;
+		--count;
+	}
+	if (dst != wcbuf) {
+		*src = s;
+	}
+	return len - count;
+}
+libc_hidden_def(mbsnrtowcs)
+
+#endif
+/**********************************************************************/
+#ifdef L_wcsnrtombs
+
+/* WARNING: We treat len as SIZE_MAX when dst is NULL! */
+
+/* Note: We completely ignore ps in all currently supported conversions.
+ * TODO: Check for valid state anyway? */
+
+size_t wcsnrtombs(char *__restrict dst, const wchar_t **__restrict src,
+					size_t NWC, size_t len, mbstate_t *__restrict ps)
+{
+	const __uwchar_t *s;
+	size_t count;
+	int incr;
+	char buf[MB_LEN_MAX];
+
+#ifdef __CTYPE_HAS_UTF_8_LOCALES
+	if (ENCODING == __ctype_encoding_utf8) {
+		return _wchar_wcsntoutf8s(dst, len, src, NWC);
+	}
+#endif /* __CTYPE_HAS_UTF_8_LOCALES */
+
+	incr = 1;
+	/* NOTE: The following is an AWFUL HACK!  In order to support %ls in
+	 * printf, we need to be able to compute the number of bytes needed
+	 * for the mbs conversion, not to exceed the precision specified.
+	 * But if dst is NULL, the return value is the length assuming a
+	 * sufficiently sized buffer.  So, we allow passing of (char *) src
+	 * as dst in order to flag that we really want the length, subject
+	 * to the restricted buffer size and no partial conversions.
+	 * See _wchar_wcsntoutf8s() as well. */
+	if (!dst || (dst == ((char *) src))) {
+		if (!dst) {
+			len = SIZE_MAX;
+		}
+		dst = buf;
+		incr = 0;
+	}
+
+	/* Since all the following encodings are single-byte encodings... */
+	if (len > NWC) {
+		len = NWC;
+	}
+
+	count = len;
+	s = (const __uwchar_t *) *src;
+
+#ifdef __CTYPE_HAS_8_BIT_LOCALES
+	if (ENCODING == __ctype_encoding_8_bit) {
+		__uwchar_t wc;
+		__uwchar_t u;
+		while (count) {
+			if ((wc = *s) <= 0x7f) {
+				if (!(*dst = (unsigned char) wc)) {
+					s = NULL;
+					break;
+				}
+			} else {
+				u = 0;
+				if (wc <= Cwc2c_DOMAIN_MAX) {
+					u = __UCLIBC_CURLOCALE->idx8wc2c[wc >> (Cwc2c_TI_SHIFT
+														+ Cwc2c_TT_SHIFT)];
+					u = __UCLIBC_CURLOCALE->tbl8wc2c[(u << Cwc2c_TI_SHIFT)
+									+ ((wc >> Cwc2c_TT_SHIFT)
+									   & ((1 << Cwc2c_TI_SHIFT)-1))];
+					u = __UCLIBC_CURLOCALE->tbl8wc2c[Cwc2c_TI_LEN
+									+ (u << Cwc2c_TT_SHIFT)
+									+ (wc & ((1 << Cwc2c_TT_SHIFT)-1))];
+				}
+
+#ifdef __WCHAR_REPLACEMENT_CHAR
+				*dst = (unsigned char) ( u ? u : __WCHAR_REPLACEMENT_CHAR );
+#else  /* __WCHAR_REPLACEMENT_CHAR */
+				if (!u) {
+					goto BAD;
+				}
+				*dst = (unsigned char) u;
+#endif /* __WCHAR_REPLACEMENT_CHAR */
+			}
+			++s;
+			dst += incr;
+			--count;
+		}
+		if (dst != buf) {
+			*src = (const wchar_t *) s;
+		}
+		return len - count;
+	}
+#endif /* __CTYPE_HAS_8_BIT_LOCALES */
+
+#ifdef __UCLIBC_HAS_LOCALE__
+	assert(ENCODING == __ctype_encoding_7_bit);
+#endif
+
+	while (count) {
+		if (*s >= 0x80) {
+#if defined(__CTYPE_HAS_8_BIT_LOCALES) && !defined(__WCHAR_REPLACEMENT_CHAR)
+		BAD:
+#endif
+			__set_errno(EILSEQ);
+			return (size_t) -1;
+		}
+		if ((*dst = (unsigned char) *s) == 0) {
+			s = NULL;
+			break;
+		}
+		++s;
+		dst += incr;
+		--count;
+	}
+	if (dst != buf) {
+		*src = (const wchar_t *) s;
+	}
+	return len - count;
+}
+libc_hidden_def(wcsnrtombs)
+
+#endif
+/**********************************************************************/
+#ifdef L_wcswidth
+
+
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning REMINDER: If we start doing translit, wcwidth and wcswidth will need updating.
+#warning TODO: Update wcwidth to match latest by Kuhn.
+#endif
+
+#if defined(__UCLIBC_HAS_LOCALE__) && \
+( defined(__CTYPE_HAS_8_BIT_LOCALES) || defined(__CTYPE_HAS_UTF_8_LOCALES) )
+
+static const unsigned char new_idx[] = {
+	0,    5,    5,    6,   10,   15,   28,   39,
+	48,   48,   71,   94,  113,  128,  139,  154,
+	175,  186,  188,  188,  188,  188,  188,  188,
+	203,  208,  208,  208,  208,  208,  208,  208,
+	208,  219,  219,  219,  222,  222,  222,  222,
+	222,  222,  222,  222,  222,  222,  222,  224,
+	224,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  231,  231,  231,
+	231,  231,  231,  231,  231,  233,  233,  233,
+	233,  233,  233,  233,  234,  234,  234,  234,
+	234,  234,  234,  234,  234,  234,  234,  234,
+	234,  234,  234,  234,  234,  234,  234,  234,
+	234,  234,  234,  234,  234,  234,  234,  234,
+	234,  234,  234,  234,  234,  234,  234,  234,
+	234,  234,  234,  234,  234,  234,  234,  234,
+	236,  236,  236,  236,  236,  236,  236,  236,
+	236,  236,  236,  236,  236,  236,  236,  236,
+	236,  236,  236,  236,  236,  236,  236,  236,
+	236,  236,  236,  236,  236,  236,  236,  236,
+	236,  237,  237,  238,  241,  241,  242,  249,
+	255,
+};
+
+static const unsigned char new_tbl[] = {
+	0x00, 0x01, 0x20, 0x7f, 0xa0, 0x00, 0x00, 0x50,
+	0x60, 0x70, 0x00, 0x83, 0x87, 0x88, 0x8a, 0x00,
+	0x91, 0xa2, 0xa3, 0xba, 0xbb, 0xbe, 0xbf, 0xc0,
+	0xc1, 0xc3, 0xc4, 0xc5, 0x00, 0x4b, 0x56, 0x70,
+	0x71, 0xd6, 0xe5, 0xe7, 0xe9, 0xea, 0xee, 0x00,
+	0x0f, 0x10, 0x11, 0x12, 0x30, 0x4b, 0xa6, 0xb1,
+	0x00, 0x01, 0x03, 0x3c, 0x3d, 0x41, 0x49, 0x4d,
+	0x4e, 0x51, 0x55, 0x62, 0x64, 0x81, 0x82, 0xbc,
+	0xbd, 0xc1, 0xc5, 0xcd, 0xce, 0xe2, 0xe4, 0x00,
+	0x02, 0x03, 0x3c, 0x3d, 0x41, 0x43, 0x47, 0x49,
+	0x4b, 0x4e, 0x70, 0x72, 0x81, 0x83, 0xbc, 0xbd,
+	0xc1, 0xc6, 0xc7, 0xc9, 0xcd, 0xce, 0x00, 0x01,
+	0x02, 0x3c, 0x3d, 0x3f, 0x40, 0x41, 0x44, 0x4d,
+	0x4e, 0x56, 0x57, 0x82, 0x83, 0xc0, 0xc1, 0xcd,
+	0xce, 0x00, 0x3e, 0x41, 0x46, 0x49, 0x4a, 0x4e,
+	0x55, 0x57, 0xbf, 0xc0, 0xc6, 0xc7, 0xcc, 0xce,
+	0x00, 0x41, 0x44, 0x4d, 0x4e, 0xca, 0xcb, 0xd2,
+	0xd5, 0xd6, 0xd7, 0x00, 0x31, 0x32, 0x34, 0x3b,
+	0x47, 0x4f, 0xb1, 0xb2, 0xb4, 0xba, 0xbb, 0xbd,
+	0xc8, 0xce, 0x00, 0x18, 0x1a, 0x35, 0x36, 0x37,
+	0x38, 0x39, 0x3a, 0x71, 0x7f, 0x80, 0x85, 0x86,
+	0x88, 0x90, 0x98, 0x99, 0xbd, 0xc6, 0xc7, 0x00,
+	0x2d, 0x31, 0x32, 0x33, 0x36, 0x38, 0x39, 0x3a,
+	0x58, 0x5a, 0x00, 0x60, 0x00, 0x12, 0x15, 0x32,
+	0x35, 0x52, 0x54, 0x72, 0x74, 0xb7, 0xbe, 0xc6,
+	0xc7, 0xc9, 0xd4, 0x00, 0x0b, 0x0f, 0xa9, 0xaa,
+	0x00, 0x0b, 0x10, 0x2a, 0x2f, 0x60, 0x64, 0x6a,
+	0x70, 0xd0, 0xeb, 0x00, 0x29, 0x2b, 0x00, 0x80,
+	0x00, 0x2a, 0x30, 0x3f, 0x40, 0x99, 0x9b, 0x00,
+	0xd0, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x1e,
+	0x1f, 0x00, 0x00, 0x10, 0x20, 0x24, 0x30, 0x70,
+	0xff, 0x00, 0x61, 0xe0, 0xe7, 0xf9, 0xfc,
+};
+
+static const signed char new_wtbl[] = {
+	0,   -1,    1,   -1,    1,    1,    0,    1,
+	0,    1,    1,    0,    1,    0,    1,    1,
+	0,    1,    0,    1,    0,    1,    0,    1,
+	0,    1,    0,    1,    1,    0,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    1,
+	0,    1,    0,    1,    0,    1,    0,    1,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    1,
+	0,    1,    0,    1,    0,    1,    0,    1,
+	0,    1,    0,    1,    0,    1,    0,    1,
+	0,    1,    0,    1,    0,    1,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    1,    0,    1,    0,    1,    0,    1,
+	0,    1,    0,    1,    0,    1,    0,    1,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    1,    0,    1,    0,    1,
+	0,    1,    0,    1,    0,    1,    0,    1,
+	0,    1,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    1,
+	0,    1,    0,    1,    0,    1,    0,    1,
+	0,    1,    2,    0,    1,    0,    1,    0,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    1,    0,    1,    0,    1,
+	1,    0,    1,    0,    1,    0,    1,    0,
+	1,    0,    1,    1,    2,    1,    1,    2,
+	2,    0,    2,    1,    2,    0,    2,    2,
+	1,    1,    2,    1,    1,    2,    1,    0,
+	1,    1,    0,    1,    0,    1,    2,    1,
+	0,    2,    1,    2,    1,    0,    1,
+};
+
+
+int wcswidth(const wchar_t *pwcs, size_t n)
+{
+	int h, l, m, count;
+	wchar_t wc;
+	unsigned char b;
+
+	if (ENCODING == __ctype_encoding_7_bit) {
+		size_t i;
+
+		for (i = 0 ; (i < n) && pwcs[i] ; i++) {
+			if (pwcs[i] != (pwcs[i] & 0x7f)) {
+				return -1;
+			}
+		}
+	}
+#ifdef __CTYPE_HAS_8_BIT_LOCALES
+	else if (ENCODING == __ctype_encoding_8_bit) {
+		mbstate_t mbstate;
+
+		mbstate.__mask = 0;			/* Initialize the mbstate. */
+		if (wcsnrtombs(NULL, &pwcs, n, SIZE_MAX, &mbstate) == ((size_t) - 1)) {
+			return -1;
+		}
+	}
+#endif /* __CTYPE_HAS_8_BIT_LOCALES */
+#if defined(__CTYPE_HAS_UTF_8_LOCALES) && defined(KUHN)
+	/* For stricter handling of allowed unicode values... see comments above. */
+	else if (ENCODING == __ctype_encoding_utf8) {
+		size_t i;
+
+		for (i = 0 ; (i < n) && pwcs[i] ; i++) {
+			if ( (((__uwchar_t)((pwcs[i]) - 0xfffeU)) < 2)
+				 || (((__uwchar_t)((pwcs[i]) - 0xd800U)) < (0xe000U - 0xd800U))
+				) {
+				return -1;
+			}
+		}
+	}
+#endif /* __CTYPE_HAS_UTF_8_LOCALES */
+
+	for (count = 0 ; n && (wc = *pwcs++) ; n--) {
+		if (wc <= 0xff) {
+			/* If we're here, wc != 0. */
+			if ((wc < 32) || ((wc >= 0x7f) && (wc < 0xa0))) {
+				return -1;
+			}
+			++count;
+			continue;
+		}
+		if (((unsigned int) wc) <= 0xffff) {
+			b = wc & 0xff;
+			h = (wc >> 8);
+			l = new_idx[h];
+			h = new_idx[h+1];
+			while ((m = (l+h) >> 1) != l) {
+				if (b >= new_tbl[m]) {
+					l = m;
+				} else {		/* wc < tbl[m] */
+					h = m;
+				}
+			}
+			count += new_wtbl[l]; /* none should be -1. */
+			continue;
+		}
+
+		/* Redo this to minimize average number of compares?*/
+		if (wc >= 0x1d167) {
+			if (wc <= 0x1d1ad) {
+				if ((wc <= 0x1d169
+					 || (wc >= 0x1d173
+						 && (wc <= 0x1d182
+							 || (wc >= 0x1d185
+								 && (wc <= 0x1d18b
+									 || (wc >= 0x1d1aa))))))
+					) {
+					continue;
+				}
+			} else if (((wc >= 0xe0020) && (wc <= 0xe007f)) || (wc == 0xe0001)) {
+				continue;
+			} else if ((wc >= 0x20000) && (wc <= 0x2ffff)) {
+				++count;		/* need 2.. add one here */
+			}
+#if (WCHAR_MAX > 0x7fffffffL)
+			else if (wc > 0x7fffffffL) {
+				return -1;
+			}
+#endif /* (WCHAR_MAX > 0x7fffffffL) */
+		}
+
+		++count;
+	}
+
+	return count;
+}
+
+#else  /*  __UCLIBC_HAS_LOCALE__ */
+
+int wcswidth(const wchar_t *pwcs, size_t n)
+{
+	int count;
+	wchar_t wc;
+	size_t i;
+
+	for (i = 0 ; (i < n) && pwcs[i] ; i++) {
+		if (pwcs[i] != (pwcs[i] & 0x7f)) {
+			return -1;
+		}
+	}
+
+	for (count = 0 ; n && (wc = *pwcs++) ; n--) {
+		if (wc <= 0xff) {
+			/* If we're here, wc != 0. */
+			if ((wc < 32) || ((wc >= 0x7f) && (wc < 0xa0))) {
+				return -1;
+			}
+			++count;
+			continue;
+		} else {
+			return -1;
+		}
+	}
+
+	return count;
+}
+
+#endif /*  __UCLIBC_HAS_LOCALE__ */
+
+libc_hidden_def(wcswidth)
+
+#endif
+/**********************************************************************/
+#ifdef L_wcwidth
+
+
+int wcwidth(wchar_t wc)
+{
+	return wcswidth(&wc, 1);
+}
+
+#endif
+/**********************************************************************/
+
+
+typedef struct {
+	mbstate_t tostate;
+	mbstate_t fromstate;
+	int tocodeset;
+	int fromcodeset;
+	int frombom;
+	int tobom;
+	int fromcodeset0;
+	int frombom0;
+	int tobom0;
+	int skip_invalid_input;		/* To support iconv -c option. */
+} _UC_iconv_t;
+
+/* For the multibyte
+ * bit 0 means swap endian
+ * bit 1 means 2 byte
+ * bit 2 means 4 byte
+ *
+ */
+
+#if defined L_iconv && defined _LIBC
+/* Used externally only by iconv utility */
+extern const unsigned char __iconv_codesets[];
+libc_hidden_proto(__iconv_codesets)
+#endif
+
+#if defined L_iconv || defined L_iconv_main
+const unsigned char __iconv_codesets[] =
+	"\x0a\xe0""WCHAR_T\x00"		/* superset of UCS-4 but platform-endian */
+#if __BYTE_ORDER == __BIG_ENDIAN
+	"\x08\xec""UCS-4\x00"		/* always BE */
+	"\x0a\xec""UCS-4BE\x00"
+	"\x0a\xed""UCS-4LE\x00"
+	"\x09\xe4""UTF-32\x00"		/* platform endian with BOM */
+	"\x0b\xe4""UTF-32BE\x00"
+	"\x0b\xe5""UTF-32LE\x00"
+	"\x08\xe2""UCS-2\x00"		/* always BE */
+	"\x0a\xe2""UCS-2BE\x00"
+	"\x0a\xe3""UCS-2LE\x00"
+	"\x09\xea""UTF-16\x00"		/* platform endian with BOM */
+	"\x0b\xea""UTF-16BE\x00"
+	"\x0b\xeb""UTF-16LE\x00"
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+	"\x08\xed""UCS-4\x00"		/* always BE */
+	"\x0a\xed""UCS-4BE\x00"
+	"\x0a\xec""UCS-4LE\x00"
+	"\x09\xf4""UTF-32\x00"		/* platform endian with BOM */
+	"\x0b\xe5""UTF-32BE\x00"
+	"\x0b\xe4""UTF-32LE\x00"
+	"\x08\xe3""UCS-2\x00"		/* always BE */
+	"\x0a\xe3""UCS-2BE\x00"
+	"\x0a\xe2""UCS-2LE\x00"
+	"\x09\xfa""UTF-16\x00"		/* platform endian with BOM */
+	"\x0b\xeb""UTF-16BE\x00"
+	"\x0b\xea""UTF-16LE\x00"
+#endif
+	"\x08\x02""UTF-8\x00"
+	"\x0b\x01""US-ASCII\x00"
+	"\x07\x01""ASCII";			/* Must be last! (special case to save a nul) */
+#endif
+#if defined L_iconv && defined _LIBC
+libc_hidden_data_def(__iconv_codesets)
+#endif
+
+
+#ifdef L_iconv
+
+#include <iconv.h>
+#include <string.h>
+#include <endian.h>
+#include <byteswap.h>
+
+#if (__BYTE_ORDER != __BIG_ENDIAN) && (__BYTE_ORDER != __LITTLE_ENDIAN)
+#error unsupported endianness for iconv
+#endif
+
+#ifndef __CTYPE_HAS_8_BIT_LOCALES
+#error currently iconv requires 8 bit locales
+#endif
+#ifndef __CTYPE_HAS_UTF_8_LOCALES
+#error currently iconv requires UTF-8 locales
+#endif
+
+
+enum {
+	IC_WCHAR_T = 0xe0,
+	IC_MULTIBYTE = 0xe0,
+#if __BYTE_ORDER == __BIG_ENDIAN
+	IC_UCS_4 =	0xec,
+	IC_UTF_32 = 0xe4,
+	IC_UCS_2 =	0xe2,
+	IC_UTF_16 = 0xea,
+#else
+	IC_UCS_4 =	0xed,
+	IC_UTF_32 = 0xe5,
+	IC_UCS_2 =	0xe3,
+	IC_UTF_16 = 0xeb,
+#endif
+	IC_UTF_8 = 2,
+	IC_ASCII = 1
+};
+
+
+static int find_codeset(const char *name)
+{
+	const unsigned char *s;
+	int codeset;
+
+	for (s = __iconv_codesets; *s; s += *s) {
+		if (!strcasecmp((char*) (s + 2), name)) {
+			return s[1];
+		}
+	}
+
+	/* The following is ripped from find_locale in locale.c. */
+
+	/* TODO: maybe CODESET_LIST + *s ??? */
+	/* 7bit is 1, UTF-8 is 2, 8-bit is >= 3 */
+	codeset = 2;
+	s = (const unsigned char *) __LOCALE_DATA_CODESET_LIST;
+	do {
+		++codeset;		/* Increment codeset first. */
+		if (!strcasecmp(__LOCALE_DATA_CODESET_LIST+*s, name)) {
+			return codeset;
+		}
+	} while (*++s);
+
+	return 0;			/* No matching codeset! */
+}
+
+iconv_t weak_function iconv_open(const char *tocode, const char *fromcode)
+{
+	register _UC_iconv_t *px;
+	int tocodeset, fromcodeset;
+
+	if (((tocodeset = find_codeset(tocode)) != 0)
+		&& ((fromcodeset = find_codeset(fromcode)) != 0)) {
+		if ((px = malloc(sizeof(_UC_iconv_t))) != NULL) {
+			px->tocodeset = tocodeset;
+			px->tobom0 = px->tobom = (tocodeset >= 0xe0) ? (tocodeset & 0x10) >> 4 : 0;
+			px->fromcodeset0 = px->fromcodeset = fromcodeset;
+			px->frombom0 = px->frombom = (fromcodeset >= 0xe0) ? (fromcodeset & 0x10) >> 4 : 0;
+			px->skip_invalid_input = px->tostate.__mask
+				= px->fromstate.__mask = 0;
+			return (iconv_t) px;
+		}
+	} else {
+		__set_errno(EINVAL);
+	}
+	return (iconv_t)(-1);
+}
+
+int weak_function iconv_close(iconv_t cd)
+{
+	free(cd);
+
+	return 0;
+}
+
+size_t weak_function iconv(iconv_t cd, char **__restrict inbuf,
+						   size_t *__restrict inbytesleft,
+						   char **__restrict outbuf,
+						   size_t *__restrict outbytesleft)
+{
+	_UC_iconv_t *px = (_UC_iconv_t *) cd;
+	size_t nrcount, r;
+	wchar_t wc, wc2;
+	int inci, inco;
+
+	assert(px != (_UC_iconv_t *)(-1));
+	assert(sizeof(wchar_t) == 4);
+
+	if (!inbuf || !*inbuf) {	/* Need to reinitialze conversion state. */
+		/* Note: For shift-state encodings we possibly need to output the
+		 * shift sequence to return to initial state! */
+		if ((px->fromcodeset & 0xf0) == 0xe0) {
+		}
+		px->tostate.__mask = px->fromstate.__mask = 0;
+		px->fromcodeset = px->fromcodeset0;
+		px->tobom = px->tobom0;
+		px->frombom = px->frombom0;
+		return 0;
+	}
+
+	nrcount = 0;
+	while (*inbytesleft) {
+		if (!*outbytesleft) {
+		TOO_BIG:
+			__set_errno(E2BIG);
+			return (size_t) -1;
+		}
+
+		inci = inco = 1;
+		if (px->fromcodeset >= IC_MULTIBYTE) {
+			inci = (px->fromcodeset == IC_WCHAR_T) ? 4: (px->fromcodeset & 6);
+			if (*inbytesleft < inci) goto INVALID;
+			wc = (((unsigned int)((unsigned char)((*inbuf)[0]))) << 8)
+				+ ((unsigned char)((*inbuf)[1]));
+			if (inci == 4) {
+				wc = (((unsigned int)((unsigned char)((*inbuf)[2]))) << 8)
+					+ ((unsigned char)((*inbuf)[3])) + (wc << 16);
+				if (!(px->fromcodeset & 1)) wc = bswap_32(wc);
+			} else {
+				if (!(px->fromcodeset & 1)) wc = bswap_16(wc);
+				if (((px->fromcodeset & IC_UTF_16) == IC_UTF_16)
+					 && (((__uwchar_t)(wc - 0xd800U)) < (0xdc00U - 0xd800U))
+					) {			/* surrogate */
+					wc =- 0xd800U;
+					if (*inbytesleft < 4) goto INVALID;
+					wc2 = (((unsigned int)((unsigned char)((*inbuf)[2]))) << 8)
+						+ ((unsigned char)((*inbuf)[3]));
+					if (!(px->fromcodeset & 1)) wc = bswap_16(wc2);
+					if (((__uwchar_t)(wc2 -= 0xdc00U)) < (0xe0000U - 0xdc00U)) {
+						goto ILLEGAL;
+					}
+					inci = 4;	/* Change inci here in case skipping illegals. */
+					wc = 0x10000UL + (wc << 10) + wc2;
+				}
+			}
+
+			if (px->frombom) {
+				px->frombom = 0;
+				if ((wc == 0xfeffU)
+					|| (wc == ((inci == 4)
+							   ? (((wchar_t) 0xfffe0000UL))
+							   : ((wchar_t)(0xfffeUL))))
+					) {
+					if (wc != 0xfeffU) {
+						px->fromcodeset ^= 1; /* toggle endianness */
+						wc = 0xfeffU;
+					}
+					if (!px->frombom) {
+						goto BOM_SKIP_OUTPUT;
+					}
+					goto GOT_BOM;
+				}
+			}
+
+			if (px->fromcodeset != IC_WCHAR_T) {
+				if (((__uwchar_t) wc) > (((px->fromcodeset & IC_UCS_4) == IC_UCS_4)
+										 ? 0x7fffffffUL : 0x10ffffUL)
+#ifdef KUHN
+					|| (((__uwchar_t)(wc - 0xfffeU)) < 2)
+					|| (((__uwchar_t)(wc - 0xd800U)) < (0xe000U - 0xd800U))
+#endif
+					) {
+					goto ILLEGAL;
+				}
+			}
+		} else if (px->fromcodeset == IC_UTF_8) {
+			const char *p = *inbuf;
+			r = _wchar_utf8sntowcs(&wc, 1, &p, *inbytesleft, &px->fromstate, 0);
+			if (((ssize_t) r) <= 0) { /* either EILSEQ or incomplete or nul */
+				if (((ssize_t) r) < 0) { /* either EILSEQ or incomplete or nul */
+					assert((r == (size_t)(-1)) || (r == (size_t)(-2)));
+					if (r == (size_t)(-2)) {
+					INVALID:
+						__set_errno(EINVAL);
+					} else {
+						px->fromstate.__mask = 0;
+						inci = 1;
+					ILLEGAL:
+						if (px->skip_invalid_input) {
+							px->skip_invalid_input = 2;	/* flag for iconv utility */
+							goto BOM_SKIP_OUTPUT;
+						}
+						__set_errno(EILSEQ);
+					}
+					return (size_t)(-1);
+				}
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning TODO: optimize this.
+#endif
+				if (p != NULL) { /* incomplete char case */
+					goto INVALID;
+				}
+				p = *inbuf + 1;	/* nul */
+			}
+			inci = p - *inbuf;
+		} else if ((wc = ((unsigned char)(**inbuf))) >= 0x80) {	/* Non-ASCII... */
+			if (px->fromcodeset == IC_ASCII) { /* US-ASCII codeset */
+				goto ILLEGAL;
+			} else {			/* some other 8-bit ascii-extension codeset */
+				const __codeset_8_bit_t *c8b
+					= __locale_mmap->codeset_8_bit + px->fromcodeset - 3;
+				wc -= 0x80;
+				wc = __UCLIBC_CURLOCALE->tbl8c2wc[
+							 (c8b->idx8c2wc[wc >> Cc2wc_IDX_SHIFT]
+							  << Cc2wc_IDX_SHIFT) + (wc & (Cc2wc_ROW_LEN - 1))];
+				if (!wc) {
+					goto ILLEGAL;
+				}
+			}
+		}
+
+
+		if (px->tobom) {
+			inci = 0;
+			wc = 0xfeffU;
+	GOT_BOM:
+			px->tobom = 0;
+		}
+
+		if (px->tocodeset >= IC_MULTIBYTE) {
+			inco = (px->tocodeset == IC_WCHAR_T) ? 4: (px->tocodeset & 6);
+			if (*outbytesleft < inco) goto TOO_BIG;
+			if (px->tocodeset != IC_WCHAR_T) {
+				if (((__uwchar_t) wc) > (((px->tocodeset & IC_UCS_4) == IC_UCS_4)
+										 ? 0x7fffffffUL : 0x10ffffUL)
+#ifdef KUHN
+					|| (((__uwchar_t)(wc - 0xfffeU)) < 2)
+					|| (((__uwchar_t)(wc - 0xd800U)) < (0xe000U - 0xd800U))
+#endif
+					) {
+				REPLACE_32:
+					wc = 0xfffd;
+					++nrcount;
+				}
+			}
+			if (inco == 4) {
+				if (px->tocodeset & 1) wc = bswap_32(wc);
+			} else {
+				if (((__uwchar_t)wc ) > 0xffffU) {
+					if ((px->tocodeset & IC_UTF_16) != IC_UTF_16) {
+						goto REPLACE_32;
+					}
+					if (*outbytesleft < (inco = 4)) goto TOO_BIG;
+					wc2 = 0xdc00U + (wc & 0x3ff);
+					wc = 0xd800U + ((wc >> 10) & 0x3ff);
+					if (px->tocodeset & 1) {
+						wc = bswap_16(wc);
+						wc2 = bswap_16(wc2);
+					}
+					wc += (wc2 << 16);
+				} else if (px->tocodeset & 1) wc = bswap_16(wc);
+			}
+			(*outbuf)[0] = (char)((unsigned char)(wc));
+			(*outbuf)[1] = (char)((unsigned char)(wc >> 8));
+			if (inco == 4) {
+				(*outbuf)[2] = (char)((unsigned char)(wc >> 16));
+				(*outbuf)[3] = (char)((unsigned char)(wc >> 24));
+			}
+		} else if (px->tocodeset == IC_UTF_8) {
+			const wchar_t *pw = &wc;
+			do {
+				r = _wchar_wcsntoutf8s(*outbuf, *outbytesleft, &pw, 1);
+				if (r != (size_t)(-1)) {
+#ifdef __UCLIBC_MJN3_ONLY__
+#warning TODO: What happens for a nul?
+#endif
+					if (r == 0) {
+						if (wc != 0) {
+							goto TOO_BIG;
+						}
+						++r;
+					}
+					break;
+				}
+				wc = 0xfffdU;
+				++nrcount;
+			} while (1);
+			inco = r;
+		} else if (((__uwchar_t)(wc)) < 0x80) {
+		CHAR_GOOD:
+				**outbuf = wc;
+		} else {
+			if ((px->tocodeset != 0x01) && (wc <= Cwc2c_DOMAIN_MAX)) {
+				const __codeset_8_bit_t *c8b
+					= __locale_mmap->codeset_8_bit + px->tocodeset - 3;
+				__uwchar_t u;
+				u = c8b->idx8wc2c[wc >> (Cwc2c_TI_SHIFT + Cwc2c_TT_SHIFT)];
+				u = __UCLIBC_CURLOCALE->tbl8wc2c[(u << Cwc2c_TI_SHIFT)
+						 + ((wc >> Cwc2c_TT_SHIFT)
+							& ((1 << Cwc2c_TI_SHIFT)-1))];
+				wc = __UCLIBC_CURLOCALE->tbl8wc2c[Cwc2c_TI_LEN
+						 + (u << Cwc2c_TT_SHIFT)
+						 + (wc & ((1 << Cwc2c_TT_SHIFT)-1))];
+				if (wc) {
+					goto CHAR_GOOD;
+				}
+			}
+			**outbuf = '?';
+			++nrcount;
+		}
+
+		*outbuf += inco;
+		*outbytesleft -= inco;
+	BOM_SKIP_OUTPUT:
+		*inbuf += inci;
+		*inbytesleft -= inci;
+	}
+	return nrcount;
+}
+#endif
diff --git a/ap/build/uClibc/libc/misc/wchar/wcrtomb.c b/ap/build/uClibc/libc/misc/wchar/wcrtomb.c
new file mode 100644
index 0000000..91eb306
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/wcrtomb.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_wcrtomb
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/wcsnrtombs.c b/ap/build/uClibc/libc/misc/wchar/wcsnrtombs.c
new file mode 100644
index 0000000..af9d6c3
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/wcsnrtombs.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_wcsnrtombs
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/wcsrtombs.c b/ap/build/uClibc/libc/misc/wchar/wcsrtombs.c
new file mode 100644
index 0000000..e5b6c0b
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/wcsrtombs.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_wcsrtombs
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/wcswidth.c b/ap/build/uClibc/libc/misc/wchar/wcswidth.c
new file mode 100644
index 0000000..3d955a2
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/wcswidth.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_wcswidth
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/wctob.c b/ap/build/uClibc/libc/misc/wchar/wctob.c
new file mode 100644
index 0000000..88d31f5
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/wctob.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_wctob
+#include "wchar.c"
diff --git a/ap/build/uClibc/libc/misc/wchar/wcwidth.c b/ap/build/uClibc/libc/misc/wchar/wcwidth.c
new file mode 100644
index 0000000..6c4a344
--- /dev/null
+++ b/ap/build/uClibc/libc/misc/wchar/wcwidth.c
@@ -0,0 +1,8 @@
+/*
+ * Copyright (C) 2004-2006 Manuel Novoa III <mjn3@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#define L_wcwidth
+#include "wchar.c"