diff options
author | Stefan Sperling <stsp@cvs.openbsd.org> | 2010-07-27 16:59:05 +0000 |
---|---|---|
committer | Stefan Sperling <stsp@cvs.openbsd.org> | 2010-07-27 16:59:05 +0000 |
commit | ca2246f7206f312d3507d148d8fca7b5028c4088 (patch) | |
tree | ce30da3359d783bea6fe127d1b15a6d9b6a52b33 /lib/libc/locale | |
parent | 357ef0a59acd38d0252d97a185411096ea76c5dd (diff) |
Replace the single-byte placeholders for the multi-byte/wide-character
conversion interfaces of libc (mbrtowc(3) and friends) with new
implementations that internally call an API based on NetBSD's citrus.
This allows us to support locales with multi-byte character encodings.
Provide two implementations of the citrus-based API: one based on the old
single-byte placeholders for use with our existing single-byte character
locales (C, ISO8859-*, KOI8, CP1251, etc.), and one that provides support
for UTF-8 encoded characters (code based on FreeBSD's implementation).
Install the en_US.UTF-8 ctype locale support file, and allow the UTF-8
ctype locale to be enabled via setlocale(3) (export LC_CTYPE='en_US.UTF-8').
A lot of programs, especially from ports, will now start using UTF-8 if the
UTF-8 locale is enabled. Use at your own risk, and please report any breakage.
Note that ncurses-based programs cannot display UTF-8 right now, this is being
worked on.
To prevent install media growth, add vfprintf(3) and mbrtowc(3) to libstubs.
The mbrtowc stub was copied unchanged from its old single-byte placeholder.
vfprintf.c doesn't need to be copied, just put in .PATH (hint by fgsch@).
Testing by myself, naddy, sthen, nicm, espie, armani, Dmitrij D. Czarkoff.
ok matthieu espie millert sthen nicm deraadt
Diffstat (limited to 'lib/libc/locale')
-rw-r--r-- | lib/libc/locale/Makefile.inc | 16 | ||||
-rw-r--r-- | lib/libc/locale/btowc.c | 54 | ||||
-rw-r--r-- | lib/libc/locale/mblen.c | 50 | ||||
-rw-r--r-- | lib/libc/locale/mbrlen.c | 41 | ||||
-rw-r--r-- | lib/libc/locale/mbstowcs.c | 45 | ||||
-rw-r--r-- | lib/libc/locale/mbtowc.c | 51 | ||||
-rw-r--r-- | lib/libc/locale/multibyte.h | 50 | ||||
-rw-r--r-- | lib/libc/locale/multibyte_citrus.c | 101 | ||||
-rw-r--r-- | lib/libc/locale/multibyte_sb.c | 212 | ||||
-rw-r--r-- | lib/libc/locale/runetable.c | 4 | ||||
-rw-r--r-- | lib/libc/locale/setrunelocale.c | 5 | ||||
-rw-r--r-- | lib/libc/locale/wcscoll.c | 43 | ||||
-rw-r--r-- | lib/libc/locale/wcstombs.c | 45 | ||||
-rw-r--r-- | lib/libc/locale/wcsxfrm.c (renamed from lib/libc/locale/mbrtowc_sb.c) | 35 | ||||
-rw-r--r-- | lib/libc/locale/wctob.c | 45 | ||||
-rw-r--r-- | lib/libc/locale/wctomb.c | 49 |
16 files changed, 595 insertions, 251 deletions
diff --git a/lib/libc/locale/Makefile.inc b/lib/libc/locale/Makefile.inc index 8800b1433eb..987996b7269 100644 --- a/lib/libc/locale/Makefile.inc +++ b/lib/libc/locale/Makefile.inc @@ -1,15 +1,15 @@ -# $OpenBSD: Makefile.inc,v 1.15 2010/02/03 20:49:00 miod Exp $ +# $OpenBSD: Makefile.inc,v 1.16 2010/07/27 16:59:03 stsp Exp $ # locale sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/locale ${LIBCSRCDIR}/locale -SRCS+= _def_messages.c _def_monetary.c _def_numeric.c _def_time.c \ - localeconv.c nl_langinfo.c setlocale.c iswctype.c mbrtowc_sb.c \ - multibyte_sb.c __mb_cur_max.c \ - wcstof.c wcstod.c wcstold.c \ - wcstol.c wcstoul.c wcstoll.c wcstoull.c wcstoimax.c wcstoumax.c \ +SRCS+= btowc.c _def_messages.c _def_monetary.c _def_numeric.c _def_time.c \ + localeconv.c nl_langinfo.c setlocale.c iswctype.c __mb_cur_max.c \ + mblen.c mbrlen.c mbstowcs.c mbtowc.c multibyte_citrus.c wcscoll.c \ + wcstombs.c wctob.c wctomb.c wcstof.c wcstod.c wcstold.c wcstol.c \ + wcstoul.c wcstoll.c wcstoull.c wcstoimax.c wcstoumax.c \ setrunelocale.c runeglue.c rune.c runetable.c ___runetype_mb.c \ - _wctrans.c + _wctrans.c wcsxfrm.c MAN+= nl_langinfo.3 setlocale.3 iswalnum.3 towlower.3 \ btowc.3 mblen.3 mbrlen.3 mbrtowc.3 mbsinit.3 mbsrtowcs.3 \ @@ -37,4 +37,4 @@ MLINKS+=setlocale.3 localeconv.3 \ wcstol.3 wcstoimax.3 \ wcstol.3 wcstoumax.3 -CFLAGS+=-I${.CURDIR} +CFLAGS+=-I${.CURDIR} -I${LIBCSRCDIR}/citrus diff --git a/lib/libc/locale/btowc.c b/lib/libc/locale/btowc.c new file mode 100644 index 00000000000..e1c6893bca9 --- /dev/null +++ b/lib/libc/locale/btowc.c @@ -0,0 +1,54 @@ +/* $OpenBSD: btowc.c,v 1.1 2010/07/27 16:59:03 stsp Exp $ */ + +/*- + * Copyright (c) 2002, 2003 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <stdio.h> +#include <string.h> +#include <wchar.h> + +wint_t +btowc(int c) +{ + mbstate_t mbs; + char cc; + wchar_t wc; + + if (c == EOF) + return (WEOF); + /* + * We expect mbrtowc() to return 0 or 1, hence the check for n > 1 + * which detects error return values as well as "impossible" byte + * counts. + */ + memset(&mbs, 0, sizeof(mbs)); + cc = (char)c; + if (mbrtowc(&wc, &cc, 1, &mbs) > 1) + return (WEOF); + return (wc); +} diff --git a/lib/libc/locale/mblen.c b/lib/libc/locale/mblen.c new file mode 100644 index 00000000000..56d718e69f4 --- /dev/null +++ b/lib/libc/locale/mblen.c @@ -0,0 +1,50 @@ +/* $OpenBSD: mblen.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ + +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +int +mblen(const char *s, size_t n) +{ + static mbstate_t mbs; + size_t rval; + + if (s == NULL) { + /* No support for state dependent encodings. */ + memset(&mbs, 0, sizeof(mbs)); + return (0); + } + rval = mbrtowc(NULL, s, n, &mbs); + if (rval == (size_t)-1 || rval == (size_t)-2) + return (-1); + return ((int)rval); +} diff --git a/lib/libc/locale/mbrlen.c b/lib/libc/locale/mbrlen.c new file mode 100644 index 00000000000..97c48d2d6ad --- /dev/null +++ b/lib/libc/locale/mbrlen.c @@ -0,0 +1,41 @@ +/* $OpenBSD: mbrlen.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ + +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <wchar.h> + +size_t +mbrlen(const char * __restrict s, size_t n, mbstate_t * __restrict ps) +{ + static mbstate_t mbs; + + if (ps == NULL) + ps = &mbs; + return (mbrtowc(NULL, s, n, ps)); +} diff --git a/lib/libc/locale/mbstowcs.c b/lib/libc/locale/mbstowcs.c new file mode 100644 index 00000000000..7ea97e4b614 --- /dev/null +++ b/lib/libc/locale/mbstowcs.c @@ -0,0 +1,45 @@ +/* $OpenBSD: mbstowcs.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ + +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <limits.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +size_t +mbstowcs(wchar_t * __restrict pwcs, const char * __restrict s, size_t n) +{ + mbstate_t mbs; + const char *sp; + + memset(&mbs, 0, sizeof(mbs)); + sp = s; + return (mbsrtowcs(pwcs, &sp, n, &mbs)); +} diff --git a/lib/libc/locale/mbtowc.c b/lib/libc/locale/mbtowc.c new file mode 100644 index 00000000000..e0dcff0b915 --- /dev/null +++ b/lib/libc/locale/mbtowc.c @@ -0,0 +1,51 @@ +/* $OpenBSD: mbtowc.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ + +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> +#include <errno.h> + +int +mbtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n) +{ + static mbstate_t mbs; + size_t rval; + + if (s == NULL) { + /* No support for state dependent encodings. */ + memset(&mbs, 0, sizeof(mbs)); + return (0); + } + rval = mbrtowc(pwc, s, n, &mbs); + if (rval == (size_t)-1 || rval == (size_t)-2) + return (-1); + return ((int)rval); +} diff --git a/lib/libc/locale/multibyte.h b/lib/libc/locale/multibyte.h new file mode 100644 index 00000000000..9a69ada2751 --- /dev/null +++ b/lib/libc/locale/multibyte.h @@ -0,0 +1,50 @@ +/* $OpenBSD: multibyte.h,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ +/* $NetBSD: multibyte.h,v 1.5 2009/01/11 02:46:28 christos 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. + */ + +#ifndef _MULTIBYTE_H_ +#define _MULTIBYTE_H_ + +typedef struct _RuneStatePriv { + _RuneLocale *__runelocale; + char __private __attribute__((__aligned__)); +} _RuneStatePriv; + +typedef union _RuneState { + mbstate_t __pad; + struct _RuneStatePriv __priv; +#define rs_runelocale __priv.__runelocale +#define rs_private __priv.__private +} _RuneState; +#define _RUNE_STATE_PRIVSIZE (sizeof(mbstate_t)-offsetof(_RuneStatePriv, __private)) + +#define _ps_to_runestate(ps) ((_RuneState *)(void *)(ps)) +#define _ps_to_runelocale(ps) (_ps_to_runestate(ps)->rs_runelocale) +#define _ps_to_private(ps) ((void *)&_ps_to_runestate(ps)->rs_private) + +#endif /*_MULTIBYTE_H_*/ diff --git a/lib/libc/locale/multibyte_citrus.c b/lib/libc/locale/multibyte_citrus.c new file mode 100644 index 00000000000..9993e67fe15 --- /dev/null +++ b/lib/libc/locale/multibyte_citrus.c @@ -0,0 +1,101 @@ +/* $OpenBSD: multibyte_citrus.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ +/* $NetBSD: multibyte_amd1.c,v 1.7 2009/01/11 02:46:28 christos Exp $ */ + +/*- + * Copyright (c)2002, 2008 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. + */ + +#include <sys/cdefs.h> +#include <sys/types.h> +#include <errno.h> +#include <wchar.h> + +#include "citrus_ctype.h" +#include "rune.h" +#include "multibyte.h" + +int +mbsinit(const mbstate_t *ps) +{ + struct _citrus_ctype_rec *cc; + _RuneLocale *rl; + + if (ps == NULL) + return 1; + + rl = _ps_to_runelocale(ps); + if (rl == NULL) + rl = _CurrentRuneLocale; + cc = rl->rl_citrus_ctype; + return (*cc->cc_ops->co_mbsinit)(ps); +} + +size_t +mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) +{ + static mbstate_t mbs; + struct _citrus_ctype_rec *cc; + + if (ps == NULL) + ps = &mbs; + cc = _CurrentRuneLocale->rl_citrus_ctype; + return (*cc->cc_ops->co_mbrtowc)(pwc, s, n, _ps_to_private(ps)); +} + +size_t +mbsrtowcs(wchar_t *pwcs, const char **s, size_t n, mbstate_t *ps) +{ + static mbstate_t mbs; + struct _citrus_ctype_rec *cc; + + if (ps == NULL) + ps = &mbs; + cc = _CurrentRuneLocale->rl_citrus_ctype; + return (*cc->cc_ops->co_mbsrtowcs)(pwcs, s, n, _ps_to_private(ps)); +} + +size_t +wcrtomb(char *s, wchar_t wc, mbstate_t *ps) +{ + static mbstate_t mbs; + struct _citrus_ctype_rec *cc; + + if (ps == NULL) + ps = &mbs; + cc = _CurrentRuneLocale->rl_citrus_ctype; + return (*cc->cc_ops->co_wcrtomb)(s, wc, _ps_to_private(ps)); +} + +size_t +wcsrtombs(char *s, const wchar_t **ppwcs, size_t n, mbstate_t *ps) +{ + static mbstate_t mbs; + struct _citrus_ctype_rec *cc; + + if (ps == NULL) + ps = &mbs; + cc = _CurrentRuneLocale->rl_citrus_ctype; + return (*cc->cc_ops->co_wcsrtombs)(s, ppwcs, n, _ps_to_private(ps)); +} diff --git a/lib/libc/locale/multibyte_sb.c b/lib/libc/locale/multibyte_sb.c deleted file mode 100644 index 4067b154b02..00000000000 --- a/lib/libc/locale/multibyte_sb.c +++ /dev/null @@ -1,212 +0,0 @@ -/* $OpenBSD: multibyte_sb.c,v 1.7 2008/08/23 07:51:35 djm 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. - */ - -#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 (size_t)-1; - return 1; -} - -int -mblen(const char *s, size_t n) -{ - - /* s may be NULL */ - - return mbrlen(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)(unsigned char)*(*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 */ - if (pwcs == NULL) - return strlen(s); - - 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; -} - -int -wcscoll(const wchar_t *s1, const wchar_t *s2) -{ - while (*s1 == *s2++) - if (*s1++ == 0) - return (0); - return ((unsigned char)(*s1) - (unsigned char)(*--s2)); -} - -size_t -wcsxfrm(wchar_t *dest, const wchar_t *src, size_t n) -{ - if (n == 0) - return wcslen(src); - return wcslcpy(dest, src, n); -} diff --git a/lib/libc/locale/runetable.c b/lib/libc/locale/runetable.c index 3324d1baa22..07dce4ba2b0 100644 --- a/lib/libc/locale/runetable.c +++ b/lib/libc/locale/runetable.c @@ -43,6 +43,8 @@ #include <wchar.h> #include "rune.h" #include "rune_local.h" +#include "citrus_ctype.h" +#include "citrus_none.h" #include <stdlib.h> _RuneLocale _DefaultRuneLocale = { @@ -378,7 +380,7 @@ _RuneLocale _DefaultRuneLocale = { { 0, NULL }, NULL, 0, "646", - 0, + &_citrus_ctype_none, { { NULL, NULL, NULL }, { NULL, NULL, NULL }, diff --git a/lib/libc/locale/setrunelocale.c b/lib/libc/locale/setrunelocale.c index bbe4cfb0f6e..8001b0087df 100644 --- a/lib/libc/locale/setrunelocale.c +++ b/lib/libc/locale/setrunelocale.c @@ -1,4 +1,4 @@ -/* $OpenBSD: setrunelocale.c,v 1.4 2008/06/26 05:42:05 ray Exp $ */ +/* $OpenBSD: setrunelocale.c,v 1.5 2010/07/27 16:59:04 stsp Exp $ */ /* $NetBSD: setrunelocale.c,v 1.14 2003/08/07 16:43:07 agc Exp $ */ /*- @@ -151,10 +151,11 @@ found: rl->rl_citrus_ctype = NULL; - if (strcmp(rl->rl_encoding, _CITRUS_DEFAULT_CTYPE_NAME) != 0) { + if (_citrus_ctype_open(&rl->rl_citrus_ctype, rl->rl_encoding)) { _NukeRune(rl); return EINVAL; } + /* register it */ lt = malloc(sizeof(struct localetable)); if (lt == NULL) { diff --git a/lib/libc/locale/wcscoll.c b/lib/libc/locale/wcscoll.c new file mode 100644 index 00000000000..6d476690c54 --- /dev/null +++ b/lib/libc/locale/wcscoll.c @@ -0,0 +1,43 @@ +/* $OpenBSD: wcscoll.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ +/* $NetBSD: wcscoll.c,v 1.1 2003/03/02 22:18:16 tshiozak 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. + */ + +#include <sys/cdefs.h> + +#include <assert.h> +#include <wchar.h> + +/* + * Compare strings with using collating information. + */ +int +wcscoll(const wchar_t *s1, const wchar_t *s2) +{ + /* XXX: LC_COLLATE should be implemented. */ + return (wcscmp(s1, s2)); +} diff --git a/lib/libc/locale/wcstombs.c b/lib/libc/locale/wcstombs.c new file mode 100644 index 00000000000..024e3afe874 --- /dev/null +++ b/lib/libc/locale/wcstombs.c @@ -0,0 +1,45 @@ +/* $OpenBSD: wcstombs.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ + +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <limits.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +size_t +wcstombs(char * __restrict s, const wchar_t * __restrict pwcs, size_t n) +{ + mbstate_t mbs; + const wchar_t *pwcsp; + + memset(&mbs, 0, sizeof(mbs)); + pwcsp = pwcs; + return (wcsrtombs(s, &pwcsp, n, &mbs)); +} diff --git a/lib/libc/locale/mbrtowc_sb.c b/lib/libc/locale/wcsxfrm.c index e47e06ae019..d2e9ff3fdfd 100644 --- a/lib/libc/locale/mbrtowc_sb.c +++ b/lib/libc/locale/wcsxfrm.c @@ -1,4 +1,5 @@ -/* $OpenBSD: mbrtowc_sb.c,v 1.4 2005/11/27 20:03:06 cloder Exp $ */ +/* $OpenBSD: wcsxfrm.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ +/* $OpenBSD: wcsxfrm.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ /* $NetBSD: multibyte_sb.c,v 1.4 2003/08/07 16:43:04 agc Exp $ */ /* @@ -30,35 +31,13 @@ * SUCH DAMAGE. */ -#include <errno.h> -#include <stdlib.h> +#include <sys/cdefs.h> #include <wchar.h> -/*ARGSUSED*/ -size_t -mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) +size_t +wcsxfrm(wchar_t *dest, const wchar_t *src, size_t n) { - - /* pwc may be NULL */ - /* s may be NULL */ - /* ps appears to be unused */ - - if (s == NULL) - return 0; if (n == 0) - return (size_t)-1; - if (pwc) - *pwc = (wchar_t)(unsigned char)*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); + return wcslen(src); + return wcslcpy(dest, src, n); } - diff --git a/lib/libc/locale/wctob.c b/lib/libc/locale/wctob.c new file mode 100644 index 00000000000..cc5a07c1484 --- /dev/null +++ b/lib/libc/locale/wctob.c @@ -0,0 +1,45 @@ +/* $OpenBSD: wctob.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <wchar.h> + +int +wctob(wint_t c) +{ + mbstate_t mbs; + char buf[MB_LEN_MAX]; + + memset(&mbs, 0, sizeof(mbs)); + if (c == WEOF || wcrtomb(buf, c, &mbs) != 1) + return (EOF); + return ((unsigned char)*buf); +} diff --git a/lib/libc/locale/wctomb.c b/lib/libc/locale/wctomb.c new file mode 100644 index 00000000000..9cd1ee4d362 --- /dev/null +++ b/lib/libc/locale/wctomb.c @@ -0,0 +1,49 @@ +/* $OpenBSD: wctomb.c,v 1.1 2010/07/27 16:59:04 stsp Exp $ */ + +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * 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. + */ + +#include <sys/cdefs.h> + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +int +wctomb(char *s, wchar_t wchar) +{ + static mbstate_t mbs; + size_t rval; + + if (s == NULL) { + /* No support for state dependent encodings. */ + memset(&mbs, 0, sizeof(mbs)); + return (0); + } + if ((rval = wcrtomb(s, wchar, &mbs)) == (size_t)-1) + return (-1); + return ((int)rval); +} |