summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/stddef.h7
-rw-r--r--include/stdlib.h5
-rw-r--r--include/wchar.h18
-rw-r--r--include/wctype.h4
-rw-r--r--lib/libc/locale/Makefile.inc10
-rw-r--r--lib/libc/locale/__mb_cur_max.c39
-rw-r--r--lib/libc/locale/btowc.387
-rw-r--r--lib/libc/locale/iswctype.399
-rw-r--r--lib/libc/locale/iswctype_sb.c67
-rw-r--r--lib/libc/locale/mblen.3178
-rw-r--r--lib/libc/locale/mbrlen.3207
-rw-r--r--lib/libc/locale/mbrtowc.3198
-rw-r--r--lib/libc/locale/mbsinit.378
-rw-r--r--lib/libc/locale/mbsrtowcs.3185
-rw-r--r--lib/libc/locale/mbstowcs.3127
-rw-r--r--lib/libc/locale/mbtowc.3179
-rw-r--r--lib/libc/locale/multibyte_sb.c226
-rw-r--r--lib/libc/locale/runetype.h25
-rw-r--r--lib/libc/locale/wcrtomb.3147
-rw-r--r--lib/libc/locale/wcsrtombs.3177
-rw-r--r--lib/libc/locale/wcstombs.3132
-rw-r--r--lib/libc/locale/wctob.388
-rw-r--r--lib/libc/locale/wctomb.3131
-rw-r--r--lib/libc/locale/wctype.391
-rw-r--r--lib/libc/shlib_version2
-rw-r--r--lib/libc/stdlib/Makefile.inc2
26 files changed, 2496 insertions, 13 deletions
diff --git a/include/stddef.h b/include/stddef.h
index 5a818e71e3a..467a51edeb8 100644
--- a/include/stddef.h
+++ b/include/stddef.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: stddef.h,v 1.7 2005/04/14 20:59:10 espie Exp $ */
+/* $OpenBSD: stddef.h,v 1.8 2005/05/11 18:44:12 espie Exp $ */
/* $NetBSD: stddef.h,v 1.4 1994/10/26 00:56:26 cgd Exp $ */
/*-
@@ -57,6 +57,11 @@ typedef _BSD_WINT_T_ wint_t;
#undef _BSD_WINT_T_
#endif
+#ifdef _BSD_MBSTATE_T_
+typedef _BSD_MBSTATE_T_ mbstate_t;
+#undef _BSD_MBSTATE_T_
+#endif
+
#ifndef NULL
#ifdef __GNUG__
#define NULL __null
diff --git a/include/stdlib.h b/include/stdlib.h
index 76a2a1f3eb9..8fdec7e2e99 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: stdlib.h,v 1.32 2004/08/03 19:59:42 millert Exp $ */
+/* $OpenBSD: stdlib.h,v 1.33 2005/05/11 18:44:12 espie Exp $ */
/* $NetBSD: stdlib.h,v 1.25 1995/12/27 21:19:08 jtc Exp $ */
/*-
@@ -84,7 +84,8 @@ typedef struct {
#define RAND_MAX 0x7fffffff
-#define MB_CUR_MAX 1 /* XXX */
+extern size_t __mb_cur_max;
+#define MB_CUR_MAX __mb_cur_max
#include <sys/cdefs.h>
diff --git a/include/wchar.h b/include/wchar.h
index a6703cd8d90..c7bd964d01e 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: wchar.h,v 1.1 2005/04/14 20:59:10 espie Exp $ */
+/* $OpenBSD: wchar.h,v 1.2 2005/05/11 18:44:12 espie Exp $ */
/* $NetBSD: wchar.h,v 1.16 2003/03/07 07:11:35 tshiozak Exp $ */
/*-
@@ -84,6 +84,11 @@ typedef _BSD_WCHAR_T_ wchar_t;
#undef _BSD_WCHAR_T_
#endif
+#ifdef _BSD_MBSTATE_T_
+typedef _BSD_MBSTATE_T_ mbstate_t;
+#undef _BSD_MBSTATE_T_
+#endif
+
#ifdef _BSD_WINT_T_
typedef _BSD_WINT_T_ wint_t;
#undef _BSD_WINT_T_
@@ -99,6 +104,14 @@ typedef _BSD_SIZE_T_ size_t;
#endif
__BEGIN_DECLS
+wint_t btowc(int);
+size_t mbrlen(const char * __restrict, size_t, mbstate_t * __restrict);
+size_t mbrtowc(wchar_t * __restrict, const char * __restrict, size_t,
+ mbstate_t * __restrict);
+int mbsinit(const mbstate_t *);
+size_t mbsrtowcs(wchar_t * __restrict, const char ** __restrict, size_t,
+ mbstate_t * __restrict);
+size_t wcrtomb(char * __restrict, wchar_t, mbstate_t * __restrict);
wchar_t *wcscat(wchar_t * __restrict, const wchar_t * __restrict);
wchar_t *wcschr(const wchar_t *, wchar_t);
int wcscmp(const wchar_t *, const wchar_t *);
@@ -113,6 +126,8 @@ wchar_t *wcsncpy(wchar_t * __restrict , const wchar_t * __restrict,
size_t);
wchar_t *wcspbrk(const wchar_t *, const wchar_t *);
wchar_t *wcsrchr(const wchar_t *, wchar_t);
+size_t wcsrtombs(char * __restrict, const wchar_t ** __restrict, size_t,
+ mbstate_t * __restrict);
size_t wcsspn(const wchar_t *, const wchar_t *);
wchar_t *wcsstr(const wchar_t *, const wchar_t *);
wchar_t *wcstok(wchar_t * __restrict, const wchar_t * __restrict,
@@ -128,6 +143,7 @@ wchar_t *wmemset(wchar_t *, wchar_t, size_t);
size_t wcslcat(wchar_t *, const wchar_t *, size_t);
size_t wcslcpy(wchar_t *, const wchar_t *, size_t);
+int wctob(wint_t);
__END_DECLS
#endif /* !_WCHAR_H_ */
diff --git a/include/wctype.h b/include/wctype.h
index 50ff0f45949..e8058e62d54 100644
--- a/include/wctype.h
+++ b/include/wctype.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: wctype.h,v 1.2 2005/04/30 09:14:23 espie Exp $ */
+/* $OpenBSD: wctype.h,v 1.3 2005/05/11 18:44:12 espie Exp $ */
/* $NetBSD: wctype.h,v 1.5 2003/03/02 22:18:11 tshiozak Exp $ */
/*-
@@ -69,6 +69,8 @@ int iswupper(wint_t);
int iswxdigit(wint_t);
wint_t towlower(wint_t);
wint_t towupper(wint_t);
+int iswctype(wint_t, wctype_t);
+wctype_t wctype(const char *);
__END_DECLS
#endif /* _WCTYPE_H_ */
diff --git a/lib/libc/locale/Makefile.inc b/lib/libc/locale/Makefile.inc
index 67edae18770..bc8bce1e538 100644
--- a/lib/libc/locale/Makefile.inc
+++ b/lib/libc/locale/Makefile.inc
@@ -1,12 +1,16 @@
-# $OpenBSD: Makefile.inc,v 1.6 2005/04/30 09:14:23 espie Exp $
+# $OpenBSD: Makefile.inc,v 1.7 2005/05/11 18:44:12 espie Exp $
# locale sources
.PATH: ${LIBCSRCDIR}/arch/${MACHINE_ARCH}/locale ${LIBCSRCDIR}/locale
SRCS+= _def_messages.c _def_monetary.c _def_numeric.c _def_time.c \
- localeconv.c nl_langinfo.c setlocale.c iswctype_sb.c
+ localeconv.c nl_langinfo.c setlocale.c iswctype_sb.c multibyte_sb.c \
+ __mb_cur_max.c
-MAN+= nl_langinfo.3 setlocale.3 iswalnum.3 towlower.3
+MAN+= nl_langinfo.3 setlocale.3 iswalnum.3 towlower.3 \
+ btowc.3 mblen.3 mbrlen.3 mbrtowc.3 mbsinit.3 mbsrtowcs.3 \
+ mbstowcs.3 mbtowc.3 wcrtomb.3 wcsrtombs.3 wcstombs.3 wctob.3 \
+ wctomb.3 wctype.3 iswctype.3
MLINKS+=setlocale.3 localeconv.3 \
iswalnum.3 iswalpha.3 \
iswalnum.3 iswblank.3 \
diff --git a/lib/libc/locale/__mb_cur_max.c b/lib/libc/locale/__mb_cur_max.c
new file mode 100644
index 00000000000..61c0d2b9c82
--- /dev/null
+++ b/lib/libc/locale/__mb_cur_max.c
@@ -0,0 +1,39 @@
+/* $OpenBSD: __mb_cur_max.c,v 1.1 2005/05/11 18:44:12 espie Exp $ */
+/* $NetBSD: __mb_cur_max.c,v 1.2 2001/01/25 01:25:06 itojun Exp $ */
+
+/*-
+ * Copyright (c)1999 Citrus 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:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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 AUTHOR 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 AUTHOR 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: __mb_cur_max.c,v 1.1 2005/05/11 18:44:12 espie Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <limits.h>
+
+size_t __mb_cur_max = 1;
+size_t __mb_len_max_runtime = MB_LEN_MAX;
+
diff --git a/lib/libc/locale/btowc.3 b/lib/libc/locale/btowc.3
new file mode 100644
index 00000000000..4e4fc78dbbb
--- /dev/null
+++ b/lib/libc/locale/btowc.3
@@ -0,0 +1,87 @@
+.\" $OpenBSD: btowc.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: btowc.3,v 1.3 2003/04/16 13:34:40 wiz Exp $
+.\"
+.\" Copyright (c)2003 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd March 3, 2003
+.Dt BTOWC 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm btowc
+.Nd convert a single byte character to a wide character
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wchar.h>
+.Ft wint_t
+.Fn btowc "int c"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn btowc
+function converts a single byte character
+.Fa c
+in the initial shift state of the current locale to a corresponding
+wide character.
+.Pp
+The behaviour of the
+.Fn btowc
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+The
+.Fn btowc
+function returns:
+.Bl -tag -width 012345678901
+.It Dv WEOF
+If
+.Fa c
+is
+.Dv EOF
+or if (unsigned char)
+.Fa c
+does not correspond to a valid single byte character representation.
+.It (otherwise)
+A wide character corresponding to
+.Fa c .
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+No errors are defined.
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr mbrtowc 3 ,
+.Xr setlocale 3 ,
+.Xr wctob 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn btowc
+function conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C90, Amendment 1 .
diff --git a/lib/libc/locale/iswctype.3 b/lib/libc/locale/iswctype.3
new file mode 100644
index 00000000000..65c984cfb49
--- /dev/null
+++ b/lib/libc/locale/iswctype.3
@@ -0,0 +1,99 @@
+.\" $OpenBSD: iswctype.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: iswctype.3,v 1.5 2003/04/16 13:34:40 wiz Exp $
+.\"
+.\" Copyright (c)2003 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd March 4, 2003
+.Dt ISWCTYPE 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm iswctype
+.Nd test a character for character class identifier
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wctype.h>
+.Ft int
+.Fn iswctype "wint_t wc" "wctype_t charclass"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn iswctype
+function returns a boolean value that indicates whether a wide character
+.Fa wc
+is in
+.Fa charclass .
+.Pp
+The behaviour of the
+.Fn iswctype
+is undefined if the
+.Fn iswctype
+function is called with an invalid
+.Fa charclass
+(changes of
+.Dv LC_CTYPE
+category invalidate
+.Fa charclass )
+or invalid wide character
+.Fa wc .
+.Pp
+The behaviour of the
+.Fn iswctype
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+The
+.Fn iswcttype
+returns:
+.Bl -tag -width 012345678901
+.It 0
+.Fa wc
+is not in
+.Fa charclass .
+.It non-zero
+.Fa wc
+is in
+.Fa charclass .
+.El
+.Pp
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+No errors are defined.
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr setlocale 3 ,
+.Xr towctrans 3 ,
+.Xr wctrans 3 ,
+.Xr wctype 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn iswctype
+function conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C90, Amendment 1 .
diff --git a/lib/libc/locale/iswctype_sb.c b/lib/libc/locale/iswctype_sb.c
index 85d6cc97e9a..980735b5113 100644
--- a/lib/libc/locale/iswctype_sb.c
+++ b/lib/libc/locale/iswctype_sb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: iswctype_sb.c,v 1.1 2005/04/30 09:14:23 espie Exp $ */
+/* $OpenBSD: iswctype_sb.c,v 1.2 2005/05/11 18:44:12 espie Exp $ */
/* $NetBSD: iswctype_sb.c,v 1.3 2003/08/07 16:43:04 agc Exp $ */
/*
@@ -36,12 +36,13 @@
*/
#if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: iswctype_sb.c,v 1.1 2005/04/30 09:14:23 espie Exp $";
+static char rcsid[] = "$OpenBSD: iswctype_sb.c,v 1.2 2005/05/11 18:44:12 espie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <wchar.h>
#include <wctype.h>
#include <ctype.h>
+#include "runetype.h"
int
iswalnum(wint_t c)
@@ -133,3 +134,65 @@ wcwidth(wint_t c)
return 1;
}
+static _WCTypeEntry names[] = {
+ "alnum", _WCTYPE_INDEX_ALNUM,
+ "alpha", _WCTYPE_INDEX_ALPHA,
+ "blank", _WCTYPE_INDEX_BLANK,
+ "cntrl", _WCTYPE_INDEX_CNTRL,
+ "digit", _WCTYPE_INDEX_DIGIT,
+ "graph", _WCTYPE_INDEX_GRAPH,
+ "lower", _WCTYPE_INDEX_LOWER,
+ "print", _WCTYPE_INDEX_PRINT,
+ "punct", _WCTYPE_INDEX_PUNCT,
+ "space", _WCTYPE_INDEX_SPACE,
+ "upper", _WCTYPE_INDEX_UPPER,
+ "xdigit", _WCTYPE_INDEX_XDIGIT
+};
+
+wctype_t
+wctype(const char *charclass)
+{
+ int i;
+
+ for (i = 0; i < sizeof names / sizeof names[0]; i++)
+ if (strcmp(names[i].te_name, charclass) == 0)
+ return (wctype_t)(&names[i]);
+ return (wctype_t)NULL;
+}
+
+int
+iswctype(wint_t c, wctype_t charclass)
+{
+ _WCTypeEntry *e = (_WCTypeEntry *)charclass;
+ if (e == NULL) {
+ return 0;
+ }
+ switch (e->te_mask) {
+ case _WCTYPE_INDEX_ALNUM:
+ return iswalnum(c);
+ case _WCTYPE_INDEX_ALPHA:
+ return iswalpha(c);
+ case _WCTYPE_INDEX_BLANK:
+ return iswblank(c);
+ case _WCTYPE_INDEX_CNTRL:
+ return iswcntrl(c);
+ case _WCTYPE_INDEX_DIGIT:
+ return iswdigit(c);
+ case _WCTYPE_INDEX_GRAPH:
+ return iswgraph(c);
+ case _WCTYPE_INDEX_LOWER:
+ return iswlower(c);
+ case _WCTYPE_INDEX_PRINT:
+ return iswprint(c);
+ case _WCTYPE_INDEX_PUNCT:
+ return iswpunct(c);
+ case _WCTYPE_INDEX_SPACE:
+ return iswspace(c);
+ case _WCTYPE_INDEX_UPPER:
+ return iswupper(c);
+ case _WCTYPE_INDEX_XDIGIT:
+ return iswxdigit(c);
+ default:
+ return 0;
+ }
+}
diff --git a/lib/libc/locale/mblen.3 b/lib/libc/locale/mblen.3
new file mode 100644
index 00000000000..c448689c797
--- /dev/null
+++ b/lib/libc/locale/mblen.3
@@ -0,0 +1,178 @@
+.\" $OpenBSD: mblen.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: mblen.3,v 1.4 2003/04/16 13:34:40 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 3, 2002
+.Dt MBLEN 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm mblen
+.Nd get number of bytes in a multibyte character
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <stdlib.h>
+.Ft int
+.Fn mblen "const char *s" "size_t n"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn mblen
+function usually determines the number of bytes in
+a multibyte character pointed to by
+.Fa s
+and returns it.
+This function shall only examine max n bytes of the array beginning from
+.Fa s .
+.Pp
+In state-dependent encodings,
+.Fa s
+may point the special sequence bytes to change the shift-state.
+Although such sequence bytes corresponds to no individual
+wide-character code,
+the
+.Fn mblen
+changes the own state by them and treats them
+as if they are a part of the subsequent multibyte character.
+.Pp
+Unlike
+.Xr mbrlen 3 ,
+the first
+.Fa n
+bytes pointed to by
+.Fa s
+need to form an entire multibyte character.
+Otherwise, this function causes an error.
+.Pp
+.Fn mblen
+is equivalent to the following call, except the internal state of the
+.Xr mbtowc 3
+function is not affected:
+.Bd -literal -offset indent
+mbtowc(NULL, s, n);
+.Ed
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of the
+.Fn mblen ,
+except for calling
+.Xr setlocale 3
+with the
+.Dv LC_CTYPE
+category changed to that of the current locale.
+Such
+.Xr setlocale 3
+calls cause the internal state of this function to be indeterminate.
+.Pp
+The behaviour of
+.Fn mblen
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+There are special cases:
+.Bl -tag -width 0123456789
+.It "s == NULL"
+.Fn mblen
+initializes its own internal state to an initial state, and
+determines whether the current encoding is state-dependent.
+This function returns 0 if the encoding is state-independent,
+otherwise non-zero.
+.It "n == 0"
+In this case,
+the first
+.Fa n
+bytes of the array pointed to by
+.Fa s
+never form a complete character.
+Thus,
+.Fn mblen
+always fails.
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+Normally,
+.Fn mblen
+returns:
+.Bl -tag -width 0123456789
+.It "0"
+.Fa s
+points to a null byte
+.Pq Sq \e0 .
+.It "positive"
+The value returned is
+a number of bytes for the valid multibyte character pointed to by
+.Fa s .
+There are no cases when this value is greater than
+.Fa n
+or the value of the
+.Dv MB_CUR_MAX
+macro.
+.It "-1"
+.Fa s
+points an invalid or incomplete multibyte character.
+The
+.Fn mblen
+also sets
+.Va errno
+to indicate the error.
+.El
+.Pp
+When
+.Fa s
+is equal to
+.Dv NULL ,
+.Fn mblen
+returns:
+.Bl -tag -width 0123456789
+.It "0"
+The current encoding is state-independent.
+.It "non-zero"
+The current encoding is state-dependent.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+The
+.Fn mblen
+may causes an error in the following case:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa s
+points to an invalid or incomplete multibyte character.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr mbrlen 3 ,
+.Xr mbtowc 3 ,
+.Xr setlocale 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn mblen
+function conforms to
+.St -ansiC .
diff --git a/lib/libc/locale/mbrlen.3 b/lib/libc/locale/mbrlen.3
new file mode 100644
index 00000000000..e6428e60805
--- /dev/null
+++ b/lib/libc/locale/mbrlen.3
@@ -0,0 +1,207 @@
+.\" $OpenBSD: mbrlen.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: mbrlen.3,v 1.5 2003/09/08 17:54:31 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 3, 2002
+.Dt MBRLEN 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm mbrlen
+.Nd get number of bytes in a multibyte character (restartable)
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wchar.h>
+.Ft int
+.Fn mbrlen "const char * restrict s" "size_t n" "mbstate_t * restrict ps"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn mbrlen
+function usually determines the number of bytes in
+a multibyte character pointed to by
+.Fa s
+and returns it.
+This function shall only examine max n bytes of the array beginning from
+.Fa s .
+.Pp
+.Fn mbrlen
+is equivalent to the following call (except
+.Fa ps
+is evaluated only once):
+.Bd -literal -offset indent
+mbrtowc(NULL, s, n, (ps != NULL) ? ps : &internal);
+.Ed
+.Pp
+Here,
+.Fa internal
+is an internal state object.
+.Pp
+In state-dependent encodings,
+.Fa s
+may point to the special sequence bytes to change the shift-state.
+Although such sequence bytes corresponds to no individual
+wide-character code, these affect the conversion state object pointed to by
+.Fa ps ,
+and the
+.Fn mbrlen
+treats the special sequence bytes
+as if these are a part of the subsequent multibyte character.
+.Pp
+Unlike
+.Xr mblen 3 ,
+.Fn mbrlen
+may accept the byte sequence when it is not a complete character
+but possibly contains part of a valid character.
+In this case, this function will accept all such bytes
+and save them into the conversion state object pointed to by
+.Fa ps .
+They will be used on subsequent calls of this function to restart
+the conversion suspended.
+.Pp
+The behaviour of the
+.Fn mbrlen
+is affected by
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+There are the special cases:
+.Bl -tag -width 0123456789
+.It "s == NULL"
+.Fn mbrlen
+sets the conversion state object pointed to by
+.Fa ps
+to an initial state and always returns 0.
+Unlike
+.Xr mblen 3 ,
+the value returned does not indicate whether the current encoding of
+the locale is state-dependent.
+.Pp
+In this case,
+.Fn mbrlen
+ignores
+.Fa n .
+.It "n == 0"
+In this case,
+the first
+.Fa n
+bytes of the array pointed to by
+.Fa s
+never form a complete character.
+Thus,
+.Fn mbrlen
+always returns (size_t)-2.
+.It "ps == NULL"
+.Fn mbrlen
+uses its own internal state object to keep the conversion state,
+instead of
+.Fa ps
+mentioned in this manual page.
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of
+.Fn mbrlen ,
+except for calling
+.Xr setlocale 3
+with a changing
+.Dv LC_CTYPE
+category of the current locale.
+Such
+.Xr setlocale 3
+calls cause the internal state of this function to be indeterminate.
+This internal state is initialized at startup time of the program.
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+The
+.Fn mbrlen
+returns:
+.Bl -tag -width 0123456789
+.It "0"
+.Fa s
+points to a null byte
+.Pq Sq \e0 .
+.It "positive"
+The value returned is
+a number of bytes for the valid multibyte character pointed to by
+.Fa s .
+There are no cases where this value is greater than
+.Fa n
+or the value of the
+.Dv MB_CUR_MAX
+macro.
+.It "(size_t)-2"
+.Fa s
+points to the byte sequence which possibly contains part of a valid
+multibyte character, but which is incomplete.
+When
+.Fa n
+is at least
+.Dv MB_CUR_MAX
+can only occur if the array pointed to by
+.Fa s
+contains a redundant shift sequence.
+.It "(size_t)-1"
+.Fa s
+points to an illegal byte sequence which does not form a valid multibyte
+character.
+In this case,
+.Fn mbrtowc
+sets
+.Va errno
+to indicate the error.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+.Fn mbrlen
+may cause an error in the following cases:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa s
+points to an invalid multibyte character.
+.It Bq Er EINVAL
+.Fa ps
+points to an invalid or uninitialized mbstate_t object.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr mblen 3 ,
+.Xr mbrtowc 3 ,
+.Xr setlocale 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn mbrlen
+function conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C90, Amendment 1 .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899/1999
+.Pq Dq ISO C99 .
diff --git a/lib/libc/locale/mbrtowc.3 b/lib/libc/locale/mbrtowc.3
new file mode 100644
index 00000000000..f8f369b7297
--- /dev/null
+++ b/lib/libc/locale/mbrtowc.3
@@ -0,0 +1,198 @@
+.\" $OpenBSD: mbrtowc.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: mbrtowc.3,v 1.5 2003/09/08 17:54:31 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 4, 2002
+.Dt MBRTOWC 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm mbrtowc
+.Nd converts a multibyte character to a wide character (restartable)
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wchar.h>
+.Ft size_t
+.Fn mbrtowc "wchar_t * restrict pwc" "const char * restrict s" "size_t n" \
+"mbstate_t * restrict ps"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn mbrtowc
+usually converts the multibyte character pointed to by
+.Fa s
+to a wide character, and stores the wide character
+in the wchar_t object pointed to by
+.Fa pwc
+if
+.Fa pwc
+is non-null and
+.Fa s
+points to a valid character.
+The conversion happens in accordance with the conversion state
+described in the mbstate_t object pointed to by
+.Fa ps .
+This function may examine at most
+.Fa n
+bytes of the array beginning from
+.Fa s .
+.Pp
+If
+.Fa s
+points to a valid character and the character corresponds to a null wide
+character, then the
+.Fn mbrtowc
+places the mbstate_t object pointed to by
+.Fa ps
+to an initial conversion state.
+.Pp
+Unlike
+.Xr mbtowc 3 ,
+the
+.Fn mbrtowc
+may accept the byte sequence pointed to by
+.Fa s
+not forming a complete multibyte character
+but which may be part of a valid character.
+In this case, this function will accept all such bytes
+and save them into the conversion state object pointed to by
+.Fa ps .
+They will be used at subsequent calls of this function to restart
+the conversion suspended.
+.Pp
+The behaviour of the
+.Fn mbrtowc
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+These are the special cases:
+.Bl -tag -width 012345678901
+.It "s == NULL"
+.Fn mbrtowc
+sets the conversion state object pointed to by
+.Fa ps
+to an initial state and always returns 0.
+Unlike
+.Xr mbtowc 3 ,
+the value returned does not indicate whether the current encoding of
+the locale is state-dependent.
+.Pp
+In this case,
+.Fn mbrtowc
+ignores
+.Fa pwc
+and
+.Fa n ,
+and is equivalent to the following call:
+.Bd -literal -offset indent
+mbrtowc(NULL, "", 1, ps);
+.Ed
+.It "pwc == NULL"
+The conversion from a multibyte character to a wide character has
+taken place and the conversion state may be affected, but the resultant
+wide character is discarded.
+.It "ps == NULL"
+.Fn mbrtowc
+uses its own internal state object to keep the conversion state,
+instead of
+.Fa ps
+mentioned in this manual page.
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of
+.Fn mbrtowc ,
+which is initialized at startup time of the program.
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+In the usual cases,
+.Fn mbrtowc
+returns:
+.Bl -tag -width 012345678901
+.It 0
+The next bytes pointed to by
+.Fa s
+form a null character.
+.It positive
+If
+.Fa s
+points to a valid character,
+.Fn mbrtowc
+returns the number of bytes in the character.
+.It (size_t)-2
+.Fa s
+points to the byte sequence which possibly contains part of a valid
+multibyte character, but which is incomplete.
+When
+.Fa n
+is at least
+.Dv MB_CUR_MAX
+only occurs if the array pointed to by
+.Fa s
+contains a redundant shift sequence.
+.It (size_t)-1
+.Fa s
+points to an illegal byte sequence which does not form a valid multibyte
+character.
+In this case,
+.Fn mbrtowc
+sets
+.Va errno
+to indicate the error.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+The
+.Fn mbrtowc
+may causes an error in the following case:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa s
+points to an invalid or incomplete multibyte character.
+.It Bq Er EINVAL
+.Fa ps
+points to an invalid or uninitialized mbstate_t object.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr mbrlen 3 ,
+.Xr mbtowc 3 ,
+.Xr setlocale 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn mbrtowc
+function conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C90, Amendment 1 .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899:1999
+.Pq Dq ISO C99 .
diff --git a/lib/libc/locale/mbsinit.3 b/lib/libc/locale/mbsinit.3
new file mode 100644
index 00000000000..18fb32a3dc6
--- /dev/null
+++ b/lib/libc/locale/mbsinit.3
@@ -0,0 +1,78 @@
+.\" $OpenBSD: mbsinit.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: mbsinit.3,v 1.4 2003/04/16 13:34:40 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 3, 2002
+.Dt MBSINIT 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm mbsinit
+.Nd determines whether the state object is in initial state
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wchar.h>
+.Ft int
+.Fn mbsinit "const mbstate_t *ps"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+.Fn mbsinit
+determines whether the state object pointed to by
+.Fa ps
+is in initial conversion state, or not.
+.Pp
+.Fa ps
+may be a
+.Dv NULL
+pointer.
+In this case,
+.Fn mbsinit
+will always return non-zero.
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn mbsinit
+returns:
+.Bl -tag -width 0123456789
+.It 0
+The current state is not in initial state.
+.It non-zero
+The current state is in initial state or
+.Fa ps
+is a
+.Dv NULL
+pointer.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+No errors are defined.
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn mbsinit
+conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C90, Amendment 1 .
diff --git a/lib/libc/locale/mbsrtowcs.3 b/lib/libc/locale/mbsrtowcs.3
new file mode 100644
index 00000000000..9d630be6397
--- /dev/null
+++ b/lib/libc/locale/mbsrtowcs.3
@@ -0,0 +1,185 @@
+.\" $OpenBSD: mbsrtowcs.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: mbsrtowcs.3,v 1.6 2003/09/08 17:54:31 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 4, 2002
+.Dt MBSRTOWCS 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm mbsrtowcs
+.Nd converts a multibyte character string to a wide character string \
+(restartable)
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wchar.h>
+.Ft size_t
+.Fn mbsrtowcs "wchar_t * restrict pwcs" "const char ** restrict s" "size_t n" \
+"mbstate_t * restrict ps"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn mbsrtowcs
+converts the multibyte character string indirectly pointed to by
+.Fa s
+to the corresponding wide character string, and stores it in the
+array pointed to by
+.Fa pwcs .
+The conversion stops due to the following reasons:
+.Bl -bullet
+.It
+The conversion reaches a null byte.
+In this case, the null byte is also converted.
+.It
+The
+.Fn mbsrtowcs
+has already stored
+.Fa n
+wide characters.
+.It
+The conversion encounters an invalid character.
+.El
+.Pp
+Each character is converted as if
+.Xr mbrtowc 3
+is continuously called.
+.Pp
+After conversion,
+if
+.Fa pwcs
+is not a
+.Dv NULL
+pointer,
+the pointer object pointed to by
+.Fa s
+is a
+.Dv NULL
+pointer (if the conversion is stopped due to reaching a null byte)
+or the first byte of the character just after the last character converted.
+.Pp
+If
+.Fa pwcs
+is not a
+null pointer and the conversion is stopped due to reaching
+a null byte, the
+.Fn mbsrtowcs
+places the state object pointed to by
+.Fa ps
+to an initial state after the conversion has taken place.
+.Pp
+The behaviour of the
+.Fn mbsrtowcs
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+These are the special cases:
+.Bl -tag -width 012345678901
+.It "s == NULL || *s == NULL"
+Undefined (may cause the program to crash).
+.It "pwcs == NULL"
+The conversion hass taken place, but the resultant wide character string
+was discarded.
+In this case, the pointer object pointed to by
+.Fa s
+is not modified and
+.Fa n
+is ignored.
+.It "ps == NULL"
+The
+.Fn mbsrtowcs
+uses its own internal state object to keep the conversion state,
+instead of
+.Fa ps
+mentioned in this manual page.
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of
+.Fn mbsrtowcs ,
+which is initialized at startup time of the program.
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn mbsrtowcs
+returns:
+.Bl -tag -width 012345678901
+.It 0 or positive
+The value returned is the number of elements stored in the array pointed to by
+.Fa pwcs ,
+except for a terminating null wide character (if any).
+If
+.Fa pwcs
+is not null and the value returned is equal to
+.Fa n ,
+the wide character string pointed to by
+.Fa pwcs
+is not null terminated.
+If
+.Fa pwcs
+is a null pointer, the value returned is the number of elements to contain
+the whole string converted, except for a terminating null wide character.
+.It (size_t)-1
+The array indirectly pointed to by
+.Fa s
+contains a byte sequence forming invalid character.
+In this case,
+.Fn mbsrtowcs
+sets
+.Va errno
+to indicate the error.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+.Fn mbsrtowcs
+may cause an error in the following cases:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+The pointer pointed to by
+.Fa s
+points to an invalid or incomplete multibyte character.
+.It Bq Er EINVAL
+.Fa ps
+points to an invalid or uninitialized mbstate_t object.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr mbrtowc 3 ,
+.Xr mbstowcs 3 ,
+.Xr setlocale 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn mbsrtowcs
+function conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C90, Amendment 1 .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899/1999
+.Dq Pq ISO C99 .
diff --git a/lib/libc/locale/mbstowcs.3 b/lib/libc/locale/mbstowcs.3
new file mode 100644
index 00000000000..21ec9446105
--- /dev/null
+++ b/lib/libc/locale/mbstowcs.3
@@ -0,0 +1,127 @@
+.\" $OpenBSD: mbstowcs.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: mbstowcs.3,v 1.6 2003/09/08 17:54:31 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 3, 2002
+.Dt MBSTOWCS 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm mbstowcs
+.Nd converts a multibyte character string to a wide character string
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <stdlib.h>
+.Ft size_t
+.Fn mbstowcs "wchar_t * restrict pwcs" "const char * restrict s" "size_t n"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn mbstowcs
+converts a null-terminated multibyte character string pointed to by
+.Fa s
+to the corresponding wide character string and stores it in the array
+pointed to by
+.Fa pwcs .
+This function may modify the first at most
+.Fa n
+elements of the array pointed to by
+.Fa pwcs .
+Each character will be converted as if
+.Xr mbtowc 3
+is continuously called, except the internal state of
+.Xr mbtowc 3
+will not be affected.
+.Pp
+For state-dependent encoding,
+.Fn mbstowcs
+implies the multibyte character string pointed to by
+.Fa s
+always begin with an initial state.
+.Pp
+These are the special cases:
+.Bl -tag -width 012345678901
+.It pwcs == NULL
+.Fn mbstowcs
+returns the number of elements to store the whole wide character string
+corresponding to the multibyte character string pointed to by
+.Fa s .
+In this case,
+.Fa n
+is ignored.
+.It s == NULL
+Undefined (may causes the program to crash).
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn mbstowcs
+returns:
+.Bl -tag -width 012345678901
+.It 0 or positive
+Number of elements stored in the array pointed to by
+.Fa pwcs .
+There are no cases where the value returned is greater than
+.Fa n
+(unless
+.Fa pwcs
+is a null pointer) or the value of the
+.Dv MB_CUR_MAX
+macro.
+If the return value is equal to
+.Fa n ,
+the string pointed to by
+.Fa pwcs
+will not be null-terminated.
+.It (size_t)-1
+.Fa s
+points to the string containing invalid or incomplete multibyte character.
+The
+.Fn mbstowcs
+also sets errno to indicate the error.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+.Fn mbstowcs
+may cause an error in the following cases:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa s
+points to the string containing invalid or incomplete multibyte character.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr mbtowc 3 ,
+.Xr setlocale 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn mbstowcs
+function conforms to
+.St -ansiC .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899/199
+.Pq Dq ISO C99 .
diff --git a/lib/libc/locale/mbtowc.3 b/lib/libc/locale/mbtowc.3
new file mode 100644
index 00000000000..14f09e2e78f
--- /dev/null
+++ b/lib/libc/locale/mbtowc.3
@@ -0,0 +1,179 @@
+.\" $OpenBSD: mbtowc.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: mbtowc.3,v 1.5 2003/09/08 17:54:31 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 3, 2002
+.Dt MBTOWC 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm mbtowc
+.Nd converts a multibyte character to a wide character
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <stdlib.h>
+.Ft int
+.Fn mbtowc "wchar_t * restrict pwc" "const char * restrict s" "size_t n"
+.Sh DESCRIPTION
+The
+.Fn mbtowc
+usually converts the multibyte character pointed to by
+.Fa s
+to a wide character, and stores it in the wchar_t object pointed to by
+.Fa pwc
+if
+.Fa pwc
+is non-null and
+.Fa s
+points to a valid character.
+This function may inspect at most n bytes of the array beginning from
+.Fa s .
+.Pp
+In state-dependent encodings,
+.Fa s
+may point to the special sequence bytes to change the shift-state.
+Although such sequence bytes correspond to no individual
+wide-character code,
+.Fn mbtowc
+changes its own state by the sequence bytes and treats them
+as if they are a part of the subsequence multibyte character.
+.Pp
+Unlike
+.Xr mbrtowc 3 ,
+the first
+.Fa n
+bytes pointed to by
+.Fa s
+need to form an entire multibyte character.
+Otherwise, this function causes an error.
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of the
+.Fn mbtowc ,
+except for calling
+.Xr setlocale 3
+with the
+.Dv LC_CTYPE
+category changed to that of the current locale.
+Such
+.Xr setlocale 3
+calls cause the internal state of this function to be indeterminate.
+.Pp
+The behaviour of
+.Fn mbtowc
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+These are the special cases:
+.Bl -tag -width 012345678901
+.It s == NULL
+.Fn mbtowc
+initializes its own internal state to an initial state, and
+determines whether the current encoding is state-dependent.
+This function returns 0 if the encoding is state-independent,
+otherwise non-zero.
+In this case,
+.Fa pwc
+is completely ignored.
+.It pwc == NULL
+.Fn mbtowc
+executes the conversion as if
+.Fa pwc
+is non-null, but a result of the conversion is discarded.
+.It n == 0
+In this case,
+the first
+.Fa n
+bytes of the array pointed to by
+.Fa s
+never form a complete character.
+Thus, the
+.Fn mbtowc
+always fails.
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+Normally,
+.Fn mbtowc
+returns:
+.Bl -tag -width 012345678901
+.It 0
+.Fa s
+points to a null byte
+.Pq Sq \e0 .
+.It positive
+Number of bytes for the valid multibyte character pointed to by
+.Fa s .
+There are no cases where the value returned is greater than
+the value of the
+.Dv MB_CUR_MAX
+macro.
+.It -1
+.Fa s
+points to an invalid or an incomplete multibyte character.
+The
+.Fn mbtowc
+also sets errno to indicate the error.
+.El
+.Pp
+When
+.Fa s
+is equal to NULL,
+.Fn mbtowc
+returns:
+.Bl -tag -width 0123456789
+.It 0
+The current encoding is state-independent.
+.It non-zero
+The current encoding is state-dependent.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+.Fn mbtowc
+may cause an error in the following cases:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa s
+points to an invalid or incomplete multibyte character.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr mblen 3 ,
+.Xr mbrtowc 3 ,
+.Xr setlocale 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn mbtowc
+function conforms to
+.St -ansiC .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899/1999
+.Pq Dq ISO C99 .
diff --git a/lib/libc/locale/multibyte_sb.c b/lib/libc/locale/multibyte_sb.c
new file mode 100644
index 00000000000..4ff06614b3f
--- /dev/null
+++ b/lib/libc/locale/multibyte_sb.c
@@ -0,0 +1,226 @@
+/* $OpenBSD: multibyte_sb.c,v 1.1 2005/05/11 18:44:12 espie Exp $ */
+/* $NetBSD: multibyte_sb.c,v 1.4 2003/08/07 16:43:04 agc Exp $ */
+
+/*
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: multibyte_sb.c,v 1.1 2005/05/11 18:44:12 espie Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <wchar.h>
+
+/*
+ * Stub multibyte character functions.
+ * This cheezy implementation is fixed to the native single-byte
+ * character set.
+ */
+
+/*ARGSUSED*/
+int
+mbsinit(const mbstate_t *ps)
+{
+
+ return 1;
+}
+
+/*ARGSUSED*/
+size_t
+mbrlen(const char *s, size_t n, mbstate_t *ps)
+{
+
+ /* ps appears to be unused */
+
+ if (s == NULL || *s == '\0')
+ return 0;
+ if (n == 0)
+ return -1;
+ return 1;
+}
+
+int
+mblen(const char *s, size_t n)
+{
+
+ /* s may be NULL */
+
+ return mbrlen(s, n, NULL);
+}
+
+/*ARGSUSED*/
+size_t
+mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+
+ /* pwc may be NULL */
+ /* s may be NULL */
+ /* ps appears to be unused */
+
+ if (s == NULL)
+ return 0;
+ if (n == 0)
+ return -1;
+ if (pwc)
+ *pwc = (wchar_t) *s;
+ return (*s != '\0');
+}
+
+int
+mbtowc(wchar_t *pwc, const char *s, size_t n)
+{
+
+ /* pwc may be NULL */
+ /* s may be NULL */
+
+ return mbrtowc(pwc, s, n, NULL);
+}
+
+/*ARGSUSED*/
+size_t
+wcrtomb(char *s, wchar_t wchar, mbstate_t *ps)
+{
+
+ /* s may be NULL */
+ /* ps appears to be unused */
+
+ if (s == NULL)
+ return 0;
+
+ *s = (char) wchar;
+ return 1;
+}
+
+int
+wctomb(char *s, wchar_t wchar)
+{
+
+ /* s may be NULL */
+
+ return wcrtomb(s, wchar, NULL);
+}
+
+/*ARGSUSED*/
+size_t
+mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps)
+{
+ int count = 0;
+
+ /* pwcs may be NULL */
+ /* s may be NULL */
+ /* ps appears to be unused */
+
+ if (!s || !*s)
+ return 0;
+
+ if (n != 0) {
+ if (pwcs != NULL) {
+ do {
+ if ((*pwcs++ = (wchar_t) *(*s)++) == 0)
+ break;
+ count++;
+ } while (--n != 0);
+ } else {
+ do {
+ if (((wchar_t)*(*s)++) == 0)
+ break;
+ count++;
+ } while (--n != 0);
+ }
+ }
+
+ return count;
+}
+
+size_t
+mbstowcs(wchar_t *pwcs, const char *s, size_t n)
+{
+
+ /* pwcs may be NULL */
+ /* s may be NULL */
+
+ return mbsrtowcs(pwcs, &s, n, NULL);
+}
+
+/*ARGSUSED*/
+size_t
+wcsrtombs(char *s, const wchar_t **pwcs, size_t n, mbstate_t *ps)
+{
+ int count = 0;
+
+ /* s may be NULL */
+ /* pwcs may be NULL */
+ /* ps appears to be unused */
+
+ if (pwcs == NULL || *pwcs == NULL)
+ return (0);
+
+ if (s == NULL) {
+ while (*(*pwcs)++ != 0)
+ count++;
+ return(count);
+ }
+
+ if (n != 0) {
+ do {
+ if ((*s++ = (char) *(*pwcs)++) == 0)
+ break;
+ count++;
+ } while (--n != 0);
+ }
+
+ return count;
+}
+
+size_t
+wcstombs(char *s, const wchar_t *pwcs, size_t n)
+{
+
+ /* s may be NULL */
+ /* pwcs may be NULL */
+
+ return wcsrtombs(s, &pwcs, n, NULL);
+}
+
+wint_t
+btowc(int c)
+{
+ if (c == EOF || c & ~0xFF)
+ return WEOF;
+ return (wint_t)c;
+}
+
+int
+wctob(wint_t c)
+{
+ if (c == WEOF || c & ~0xFF)
+ return EOF;
+ return (int)c;
+}
diff --git a/lib/libc/locale/runetype.h b/lib/libc/locale/runetype.h
index f47d6a03129..e170ff7d4a7 100644
--- a/lib/libc/locale/runetype.h
+++ b/lib/libc/locale/runetype.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: runetype.h,v 1.1 2005/04/14 20:59:10 espie Exp $ */
+/* $OpenBSD: runetype.h,v 1.2 2005/05/11 18:44:12 espie Exp $ */
#ifndef _NB_RUNETYPE_H_
#define _NB_RUNETYPE_H_
@@ -8,4 +8,27 @@
typedef uint32_t __nbrune_t;
+typedef uint32_t _RuneType;
+
+/*
+ * wctype stuffs.
+ */
+typedef struct _WCTypeEntry {
+ char *te_name;
+ _RuneType te_mask;
+} _WCTypeEntry;
+#define _WCTYPE_INDEX_ALNUM 0
+#define _WCTYPE_INDEX_ALPHA 1
+#define _WCTYPE_INDEX_BLANK 2
+#define _WCTYPE_INDEX_CNTRL 3
+#define _WCTYPE_INDEX_DIGIT 4
+#define _WCTYPE_INDEX_GRAPH 5
+#define _WCTYPE_INDEX_LOWER 6
+#define _WCTYPE_INDEX_PRINT 7
+#define _WCTYPE_INDEX_PUNCT 8
+#define _WCTYPE_INDEX_SPACE 9
+#define _WCTYPE_INDEX_UPPER 10
+#define _WCTYPE_INDEX_XDIGIT 11
+#define _WCTYPE_NINDEXES 12
+
#endif
diff --git a/lib/libc/locale/wcrtomb.3 b/lib/libc/locale/wcrtomb.3
new file mode 100644
index 00000000000..d1845fdbd25
--- /dev/null
+++ b/lib/libc/locale/wcrtomb.3
@@ -0,0 +1,147 @@
+.\" $OpenBSD: wcrtomb.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: wcrtomb.3,v 1.4 2003/09/08 17:54:31 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 4, 2002
+.Dt WCRTOMB 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm wcrtomb
+.Nd converts a wide character to a multibyte character (restartable)
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wchar.h>
+.Ft size_t
+.Fn wcrtomb "const char * restrict s" "wchar_t wc" "mbstate_t * restrict ps"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+.Fn wcrtomb
+converts the wide character given by
+.Fa wc
+to the corresponding multibyte character, and stores it in the array
+pointed to by
+.Fa s
+unless
+.Fa s
+is a null pointer.
+This function will modify the first at most
+.Dv MB_CUR_MAX
+bytes of the array pointed by
+.Fa s .
+.Pp
+The behaviour of
+.Fn wcrtomb
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+These are the special cases:
+.Bl -tag -width 012345678901
+.It "wc == 0"
+For state-dependent encodings,
+.Fn wcrtomb
+stores a null byte preceded by a special byte sequence (if any)
+to return to an initial state to the array pointed by
+.Fa s ,
+and the state object pointed by
+.Fa ps
+also returned to a initial state.
+.It "s == NULL"
+.Fn wcrtomb
+just places
+.Fa ps
+into a initial state.
+It is equivalent to the following call:
+.Bd -literal -offset indent
+wcrtomb(buf, L'\\0', ps);
+.Ed
+.Pp
+Here,
+.Fa buf
+is a dummy buffer.
+In this case,
+.Fa wc
+is ignored.
+.It "ps == NULL"
+.Fn mbrtowc
+uses its own internal state object to keep the conversion state,
+instead of
+.Fa ps
+mentioned in this manual page.
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of
+.Fn mbrtowc ,
+which is initialized at startup time of the program.
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn wcrtomb
+returns:
+.Bl -tag -width 012345678901
+.It "positive"
+The number of bytes (including any shift sequences)
+which are stored in the array.
+.It "(size_t)-1"
+.Fa wc
+is not a valid wide character.
+In this case,
+.Fn wcrtomb
+also sets
+.Va errno
+to indicate error.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+.Fn wcrtomb
+may cause an error in the following cases:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa wc
+is not a valid wide character.
+.It Bq Er EINVAL
+.Fa ps
+points to an invalid or uninitialized mbstate_t object.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr setlocale 3 ,
+.Xr wctomb 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn wcrtomb
+function conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C90, Amendment 1 .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899/1999
+.Pq Dq ISO C99 .
diff --git a/lib/libc/locale/wcsrtombs.3 b/lib/libc/locale/wcsrtombs.3
new file mode 100644
index 00000000000..f75faa19739
--- /dev/null
+++ b/lib/libc/locale/wcsrtombs.3
@@ -0,0 +1,177 @@
+.\" $OpenBSD: wcsrtombs.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: wcsrtombs.3,v 1.6 2003/09/08 17:54:32 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 4, 2002
+.Dt WCSRTOMBS 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm wcsrtombs
+.Nd converts a wide character string to a multibyte character string \
+(restartable)
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <stdlib.h>
+.Ft size_t
+.Fn wcsrtombs "const char * restrict s" "const wchar_t ** restrict pwcs" \
+"size_t n" "mbstate_t * restrict ps"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn wcsrtombs
+converts the null-terminated wide character string indirectly pointed to by
+.Fa pwcs
+to the corresponding multibyte character string,
+and store it to the array pointed to by
+.Fa s .
+The conversion stops due to the following reasons:
+.Bl -bullet
+.It
+The conversion reaches a null wide character.
+In this case, the null wide character is also converted.
+.It
+The
+.Fn wcsrtombs
+has already stored
+.Fa n
+bytes to the array pointed to by
+.Fa s .
+.It
+The conversion encounters an invalid character.
+.El
+.Pp
+Each characters will be converted as if
+.Xr wcrtomb 3
+is continuously called, except the internal state of
+.Xr wcrtomb 3
+will not be affected.
+.Pp
+After conversion,
+if
+.Fa s
+is not a
+.Dv NULL
+pointer,
+the pointer object pointed to by
+.Fa pwcs
+is a
+.Dv NULL
+pointer (if the conversion is stopped due to reaching a null wide character)
+or the first byte of the character just after the last character converted.
+.Pp
+If
+.Fa s
+is not a null pointer and the conversion is stopped due to reaching
+a null wide character, the
+.Fn wcsrtombs
+places the state object pointed to by
+.Fa ps
+to an initial state after the conversion is taken place.
+.Pp
+The behaviour of the
+.Fn wcsrtombs
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+These are the special cases:
+.Bl -tag -width 012345678901
+.It "s == NULL"
+.Fn wcsrtombs
+returns the number of bytes to store the whole multibyte character string
+corresponding to the wide character string pointed to by
+.Fa pwcs ,
+not including the terminating null byte.
+In this case,
+.Fa n
+is ignored.
+.It "pwcs == NULL || *pwcs == NULL"
+Undefined (may causes the program to crash).
+.It "ps == NULL"
+.Fn wcsrtombs
+uses its own internal state object to keep the conversion state,
+instead of
+.Fa ps
+mentioned in this manual page.
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of
+.Fn wcsrtombs ,
+that is initialized at startup time of the program.
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn wcsrtombs
+returns:
+.Bl -tag -width 012345678901
+.It 0 or positive
+Number of bytes stored to the array pointed to by
+.Fa s ,
+except for a null byte.
+There is no cases that the value returned is greater than
+.Fa n
+(unless
+.Fa s
+is a null pointer).
+If the return value is equal to
+.Fa n ,
+the string pointed to by
+.Fa s
+will not be null-terminated.
+.It (size_t)-1
+.Fa pwcs
+points to the string containing invalid wide character.
+The
+.Fn wcsrtombs
+also sets errno to indicate the error.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+.Fn wcsrtombs
+may cause an error in the following cases:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa pwcs
+points to the string containing an invalid wide character.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr setlocale 3 ,
+.Xr wcrtomb 3 ,
+.Xr wcstombs 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn wcsrtombs
+function conforms to
+.St -ansiC .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899/AMD1:1995
+.Pq Dq ISO C99 .
diff --git a/lib/libc/locale/wcstombs.3 b/lib/libc/locale/wcstombs.3
new file mode 100644
index 00000000000..e4a5fc9fff0
--- /dev/null
+++ b/lib/libc/locale/wcstombs.3
@@ -0,0 +1,132 @@
+.\" $OpenBSD: wcstombs.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: wcstombs.3,v 1.5 2003/09/08 17:54:32 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 4, 2002
+.Dt WCSTOMBS 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm wcstombs
+.Nd converts a wide character string to a multibyte character string
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <stdlib.h>
+.Ft size_t
+.Fn wcstombs "const char * restrict s" "wchar_t * restrict pwcs" "size_t n"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+.Fn wcstombs
+converts the null-terminated wide character string pointed to by
+.Fa pwcs
+to the corresponding multibyte character string,
+and stores it in the array pointed to by
+.Fa s .
+This function may modify the first at most
+.Fa n
+bytes of the array pointed to by
+.Fa s .
+Each character will be converted as if
+.Xr wctomb 3
+is continuously called, except the internal state of
+.Xr wctomb 3
+will not be affected.
+.Pp
+For state-dependent encoding, the
+.Fn wcstombs
+implies the result multibyte character string pointed to by
+.Fa s
+always to begin with an initial state.
+.Pp
+The behaviour of the
+.Fn wcstombs
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+There are special cases:
+.Bl -tag -width 012345678901
+.It s == NULL
+The
+.Fn wcstombs
+returns the number of bytes to store the whole multibyte character string
+corresponding to the wide character string pointed to by
+.Fa pwcs .
+In this case,
+.Fa n
+is ignored.
+.It pwcs == NULL
+Undefined (may causes the program to crash).
+.El
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn wcstombs
+returns:
+.Bl -tag -width 012345678901
+.It 0 or positive
+Number of bytes stored in the array pointed to by
+.Fa s .
+There are no cases that the value returned is greater than
+.Fa n
+(unless
+.Fa s
+is a null pointer).
+If the return value is equal to
+.Fa n ,
+the string pointed to by
+.Fa s
+will not be null-terminated.
+.It (size_t)-1
+.Fa pwcs
+points the string containing invalid wide character.
+.Fn wcstombs
+also sets
+.Va errno
+to indicate the error.
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+.Fn wcstombs
+may cause an error in the following cases:
+.Bl -tag -width Er
+.It Bq Er EILSEQ
+.Fa pwcs
+Points to the string containing invalid wide character.
+.El
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr setlocale 3 ,
+.Xr wctomb 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn wcstombs
+function conforms to
+.St -ansiC .
+The restrict qualifier is added at
+.\" .St -isoC99 .
+ISO/IEC 9899/1999
+.Pq Dq ISO C99 .
diff --git a/lib/libc/locale/wctob.3 b/lib/libc/locale/wctob.3
new file mode 100644
index 00000000000..191568b5d71
--- /dev/null
+++ b/lib/libc/locale/wctob.3
@@ -0,0 +1,88 @@
+.\" $OpenBSD: wctob.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: wctob.3,v 1.3 2003/04/16 13:34:41 wiz Exp $
+.\"
+.\" Copyright (c)2003 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd March 3, 2003
+.Dt WCTOB 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm wctob
+.Nd convert a wide character to a single byte character
+.\" ----------------------------------------------------------------------
+.Sh LIBRARY
+.Lb libc
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.In wchar.h
+.Ft int
+.Fn wctob "wint_t wc"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn wctob
+function converts a wide character
+.Fa wc
+to a corresponding single byte character in the initial shift state of
+the current locale.
+.Pp
+The behaviour of the
+.Fn wctob
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+The
+.Fn wctob
+function returns:
+.Bl -tag -width 012345678901
+.It Dv EOF
+if
+.Fa wc
+is
+.Dv WEOF
+or if
+.Fa wc
+does not correspond to a valid single byte character representation.
+.It (otherwise)
+a single byte character corresponding to
+.Fa wc .
+.El
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+No errors are defined.
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr btowc 3 ,
+.Xr setlocale 3 ,
+.Xr wcrtomb 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn wctob
+function conforms to
+.St -isoC-amd1 .
diff --git a/lib/libc/locale/wctomb.3 b/lib/libc/locale/wctomb.3
new file mode 100644
index 00000000000..758a2962bc6
--- /dev/null
+++ b/lib/libc/locale/wctomb.3
@@ -0,0 +1,131 @@
+.\" $OpenBSD: wctomb.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: wctomb.3,v 1.3 2003/04/16 13:34:41 wiz Exp $
+.\"
+.\" Copyright (c)2002 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd February 3, 2002
+.Dt WCTOMB 3
+.Os
+.Sh NAME
+.Nm wctomb
+.Nd converts a wide character to a multibyte character
+.Sh SYNOPSIS
+.Fd #include <stdlib.h>
+.Ft int
+.Fn wctomb "char * s" "const wchar_t wchar"
+.Sh DESCRIPTION
+The
+.Fn wctomb
+converts the wide character
+.Fa wchar
+to the corresponding multibyte character, and stores it in the array
+pointed to by
+.Fa s .
+.Fn wctomb
+may store at most
+.Dv MB_CUR_MAX
+bytes in the array.
+.Pp
+In state-dependent encoding,
+.Fn wctomb
+may store the special sequence to change the conversion state
+before an actual multibyte character into the array pointed to by
+.Fa s .
+If
+.Fa wchar
+is a null wide character
+.Pq Sq \e0 ,
+this function places its own internal state to an initial conversion state.
+.Pp
+Calling any other functions in
+.Em libc
+never change the internal
+state of
+.Fn wctomb ,
+except for calling
+.Xr setlocale 3
+with the
+.Dv LC_CTYPE
+category changed to that of the current locale.
+Such
+.Xr setlocale 3
+calls cause the internal state of this function to be indeterminate.
+.Pp
+The behaviour of
+.Fn wctomb
+is affected by
+.Dv LC_CTYPE
+category of the current locale.
+.Pp
+There is a special case:
+.Bl -tag -width 012345678901
+.It s == NULL
+.Fn wctomb
+initializes its own internal state to an initial state, and
+determines whether the current encoding is state-dependent.
+This function returns 0 if the encoding is state-independent,
+otherwise non-zero.
+In this case,
+.Fa wchar
+is completely ignored.
+.El
+.Sh RETURN VALUES
+Normally,
+.Fn wctomb
+returns:
+.Bl -tag -width 012345678901
+.It positive
+Number of bytes for the valid multibyte character pointed to by
+.Fa s .
+There are no cases where the value returned is greater than
+.Fa n
+or the value of the
+.Dv MB_CUR_MAX macro .
+.It -1
+.Fa wchar
+is an invalid wide character.
+.El
+.Pp
+If
+.Fa s
+is equal to
+.Dv NULL ,
+.Fn mbtowc
+returns:
+.Bl -tag -width 0123456789
+.It 0
+The current encoding is state-independent.
+.It non-zero
+The current encoding is state-dependent.
+.El
+.Sh ERRORS
+No errors are defined.
+.Sh SEE ALSO
+.Xr setlocale 3
+.Sh STANDARDS
+The
+.Fn wctomb
+function conforms to
+.St -ansiC .
diff --git a/lib/libc/locale/wctype.3 b/lib/libc/locale/wctype.3
new file mode 100644
index 00000000000..74a042dd652
--- /dev/null
+++ b/lib/libc/locale/wctype.3
@@ -0,0 +1,91 @@
+.\" $OpenBSD: wctype.3,v 1.1 2005/05/11 18:44:12 espie Exp $
+.\" $NetBSD: wctype.3,v 1.4 2003/04/16 13:34:41 wiz Exp $
+.\"
+.\" Copyright (c)2003 Citrus 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:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.Dd March 4, 2003
+.Dt WCTYPE 3
+.Os
+.\" ----------------------------------------------------------------------
+.Sh NAME
+.Nm wctype
+.Nd get character class identifier by name
+.\" ----------------------------------------------------------------------
+.Sh SYNOPSIS
+.Fd #include <wctype.h>
+.Ft wctype_t
+.Fn wctype "const char *charclass"
+.\" ----------------------------------------------------------------------
+.Sh DESCRIPTION
+The
+.Fn wctype
+function returns a character class identifier corresponding to the
+locale-specific character class name
+.Fa charclass .
+This identifier can be used in subsequent calls of
+.Fn iswctype .
+The following names are defined in all locales:
+.Bd -literal -offset indent
+alnum alpha blank cntrl digit graph
+lower print punct space upper xdigit
+.Ed
+.Pp
+The behaviour of
+.Fn wctype
+is affected by the
+.Dv LC_CTYPE
+category of the current locale.
+.\" ----------------------------------------------------------------------
+.Sh RETURN VALUES
+.Fn wcttype
+returns:
+.Bl -tag -width 012345678901
+.It 0
+If
+.Fa charclass
+does not correspond to a valid character class name.
+.It non-zero
+A character class identifier corresponding to
+.Fa charclass .
+.El
+.Pp
+Note: wctype_t is a scalar type, e.g., a pointer.
+.\" ----------------------------------------------------------------------
+.Sh ERRORS
+No errors are defined.
+.\" ----------------------------------------------------------------------
+.Sh SEE ALSO
+.Xr iswctype 3 ,
+.Xr setlocale 3 ,
+.Xr towctrans 3 ,
+.Xr wctrans 3
+.\" ----------------------------------------------------------------------
+.Sh STANDARDS
+The
+.Fn wctype
+function conforms to
+.\" .St -isoC-amd1 .
+ISO/IEC 9899/AMD1:1995
+.Pq Sq ISO C90, Amendment 1 .
diff --git a/lib/libc/shlib_version b/lib/libc/shlib_version
index ca182c4511c..fbdb2500180 100644
--- a/lib/libc/shlib_version
+++ b/lib/libc/shlib_version
@@ -1,4 +1,4 @@
-major=36
+major=37
minor=0
# note: If changes were made to include/thread_private.h or if system
# calls were added/changed then libpthread must also be updated.
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc
index 1d5ba5c9bd4..ba81d5ee087 100644
--- a/lib/libc/stdlib/Makefile.inc
+++ b/lib/libc/stdlib/Makefile.inc
@@ -6,7 +6,7 @@
SRCS+= a64l.c abort.c atexit.c atoi.c atof.c atol.c atoll.c bsearch.c \
calloc.c cfree.c exit.c ecvt.c gcvt.c getenv.c getopt_long.c \
getsubopt.c hcreate.c heapsort.c l64a.c llabs.c lsearch.c malloc.c \
- merge.c multibyte.c putenv.c qsort.c radixsort.c rand.c random.c \
+ merge.c putenv.c qsort.c radixsort.c rand.c random.c \
realpath.c setenv.c strtod.c strtol.c strtoll.c strtonum.c strtoul.c \
strtoull.c system.c \
tfind.c tsearch.c _rand48.c drand48.c erand48.c jrand48.c lcong48.c \