summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libc/citrus/Makefile.inc4
-rw-r--r--lib/libc/citrus/citrus_ctype.c61
-rw-r--r--lib/libc/citrus/citrus_ctype.h25
-rw-r--r--lib/libc/citrus/citrus_ctype_local.h87
-rw-r--r--lib/libc/citrus/citrus_none.c38
-rw-r--r--lib/libc/citrus/citrus_none.h39
-rw-r--r--lib/libc/citrus/citrus_utf8.c35
-rw-r--r--lib/libc/citrus/citrus_utf8.h41
-rw-r--r--lib/libc/locale/multibyte.h50
-rw-r--r--lib/libc/locale/multibyte_citrus.c44
-rw-r--r--lib/libc/locale/rune.c15
-rw-r--r--lib/libc/locale/rune_local.h3
-rw-r--r--lib/libc/locale/runetable.c2
-rw-r--r--lib/libc/locale/runetype.h3
-rw-r--r--lib/libc/locale/setrunelocale.c25
15 files changed, 67 insertions, 405 deletions
diff --git a/lib/libc/citrus/Makefile.inc b/lib/libc/citrus/Makefile.inc
index b1466442dd9..de833401d8a 100644
--- a/lib/libc/citrus/Makefile.inc
+++ b/lib/libc/citrus/Makefile.inc
@@ -1,7 +1,7 @@
-# $OpenBSD: Makefile.inc,v 1.1 2010/07/27 16:59:03 stsp Exp $
+# $OpenBSD: Makefile.inc,v 1.2 2016/09/05 09:47:02 schwarze Exp $
# citrus sources
.PATH: ${LIBCSRCDIR}/citrus
-SRCS+= citrus_ctype.c citrus_none.c citrus_utf8.c
+SRCS+= citrus_none.c citrus_utf8.c
CFLAGS+=-I${.CURDIR}
diff --git a/lib/libc/citrus/citrus_ctype.c b/lib/libc/citrus/citrus_ctype.c
deleted file mode 100644
index 125428210ca..00000000000
--- a/lib/libc/citrus/citrus_ctype.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $OpenBSD: citrus_ctype.c,v 1.5 2015/08/27 04:37:09 guenther Exp $ */
-/* $NetBSD: citrus_ctype.c,v 1.5 2008/06/14 16:01:07 tnozaki Exp $ */
-
-/*-
- * Copyright (c)1999, 2000, 2001, 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.
- */
-
-#include <sys/types.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <wchar.h>
-#include "citrus_ctype.h"
-#include "citrus_none.h"
-#include "citrus_utf8.h"
-
-struct _citrus_ctype_rec _citrus_ctype_none = {
- &_citrus_none_ctype_ops, /* cc_ops */
- 1 /* cc_mb_cur_max */
-};
-
-static struct _citrus_ctype_rec _citrus_ctype_utf8 = {
- &_citrus_utf8_ctype_ops, /* cc_ops */
- _CITRUS_UTF8_MB_CUR_MAX /* cc_mb_cur_max */
-};
-
-int
-_citrus_ctype_open(struct _citrus_ctype_rec **rcc, char const *encname)
-{
- if (!strcmp(encname, "NONE")) {
- *rcc = &_citrus_ctype_none;
- return (0);
- } else if (!strcmp(encname, "UTF8")) {
- *rcc = &_citrus_ctype_utf8;
- return (0);
- }
-
- return (-1);
-}
diff --git a/lib/libc/citrus/citrus_ctype.h b/lib/libc/citrus/citrus_ctype.h
index 5949111216a..6c18b8d2dac 100644
--- a/lib/libc/citrus/citrus_ctype.h
+++ b/lib/libc/citrus/citrus_ctype.h
@@ -1,5 +1,4 @@
-/* $OpenBSD: citrus_ctype.h,v 1.4 2015/08/27 04:37:09 guenther Exp $ */
-/* $NetBSD: citrus_ctype.h,v 1.2 2003/03/05 20:18:15 tshiozak Exp $ */
+/* $OpenBSD: citrus_ctype.h,v 1.5 2016/09/05 09:47:02 schwarze Exp $ */
/*-
* Copyright (c)2002 Citrus Project,
@@ -31,12 +30,28 @@
#ifndef _CITRUS_CTYPE_H_
#define _CITRUS_CTYPE_H_
-#include "citrus_ctype_local.h"
+#define _CITRUS_UTF8_MB_CUR_MAX 4
__BEGIN_HIDDEN_DECLS
-extern struct _citrus_ctype_rec _citrus_ctype_none;
+size_t _citrus_none_ctype_mbrtowc(wchar_t * __restrict,
+ const char * __restrict, size_t);
+size_t _citrus_none_ctype_mbsnrtowcs(wchar_t * __restrict,
+ const char ** __restrict, size_t, size_t);
+size_t _citrus_none_ctype_wcrtomb(char * __restrict, wchar_t);
+size_t _citrus_none_ctype_wcsnrtombs(char * __restrict,
+ const wchar_t ** __restrict, size_t, size_t);
-int _citrus_ctype_open(struct _citrus_ctype_rec **, char const *);
+size_t _citrus_utf8_ctype_mbrtowc(wchar_t * __restrict,
+ const char * __restrict, size_t, mbstate_t * __restrict);
+int _citrus_utf8_ctype_mbsinit(const mbstate_t * __restrict);
+size_t _citrus_utf8_ctype_mbsnrtowcs(wchar_t * __restrict,
+ const char ** __restrict, size_t, size_t,
+ mbstate_t * __restrict);
+size_t _citrus_utf8_ctype_wcrtomb(char * __restrict, wchar_t,
+ mbstate_t * __restrict);
+size_t _citrus_utf8_ctype_wcsnrtombs(char * __restrict,
+ const wchar_t ** __restrict, size_t, size_t,
+ mbstate_t * __restrict);
__END_HIDDEN_DECLS
#endif
diff --git a/lib/libc/citrus/citrus_ctype_local.h b/lib/libc/citrus/citrus_ctype_local.h
deleted file mode 100644
index 7753ac1513a..00000000000
--- a/lib/libc/citrus/citrus_ctype_local.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* $OpenBSD: citrus_ctype_local.h,v 1.4 2013/05/03 13:53:49 stsp Exp $ */
-/* $NetBSD: citrus_ctype_local.h,v 1.2 2003/03/05 20:18:15 tshiozak 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 _CITRUS_CTYPE_LOCAL_H_
-#define _CITRUS_CTYPE_LOCAL_H_
-
-#define _CITRUS_CTYPE_DECLS(_e_) \
-size_t _citrus_##_e_##_ctype_mbrtowc(wchar_t * __restrict, \
- const char * __restrict, size_t, \
- void * __restrict); \
-int _citrus_##_e_##_ctype_mbsinit(const void * __restrict); \
-size_t _citrus_##_e_##_ctype_mbsnrtowcs(wchar_t * __restrict, \
- const char ** __restrict, \
- size_t, size_t, \
- void * __restrict); \
-size_t _citrus_##_e_##_ctype_wcrtomb(char * __restrict, wchar_t, \
- void * __restrict); \
-size_t _citrus_##_e_##_ctype_wcsnrtombs(char * __restrict, \
- const wchar_t ** __restrict, \
- size_t, size_t, \
- void * __restrict); \
-
-#define _CITRUS_CTYPE_DEF_OPS(_e_) \
-struct _citrus_ctype_ops_rec _citrus_##_e_##_ctype_ops = { \
- /* co_mbrtowc */ &_citrus_##_e_##_ctype_mbrtowc, \
- /* co_mbsinit */ &_citrus_##_e_##_ctype_mbsinit, \
- /* co_mbsnrtowcs */ &_citrus_##_e_##_ctype_mbsnrtowcs, \
- /* co_wcrtomb */ &_citrus_##_e_##_ctype_wcrtomb, \
- /* co_wcsnrtombs */ &_citrus_##_e_##_ctype_wcsnrtombs, \
-}
-
-typedef size_t (*_citrus_ctype_mbrtowc_t)
- (wchar_t * __restrict, const char * __restrict,
- size_t, void * __restrict);
-typedef int (*_citrus_ctype_mbsinit_t) (const void * __restrict);
-typedef size_t (*_citrus_ctype_mbsnrtowcs_t)
- (wchar_t * __restrict, const char ** __restrict,
- size_t, size_t, void * __restrict);
-typedef size_t (*_citrus_ctype_wcrtomb_t)
- (char * __restrict, wchar_t, void * __restrict);
-typedef size_t (*_citrus_ctype_wcsnrtombs_t)
- (char * __restrict, const wchar_t ** __restrict,
- size_t, size_t, void * __restrict);
-
-struct _citrus_ctype_ops_rec {
- _citrus_ctype_mbrtowc_t co_mbrtowc;
- _citrus_ctype_mbsinit_t co_mbsinit;
- _citrus_ctype_mbsnrtowcs_t co_mbsnrtowcs;
- _citrus_ctype_wcrtomb_t co_wcrtomb;
- _citrus_ctype_wcsnrtombs_t co_wcsnrtombs;
-};
-
-#define _CITRUS_DEFAULT_CTYPE_NAME "NONE"
-
-struct _citrus_ctype_rec {
- struct _citrus_ctype_ops_rec *cc_ops;
- size_t cc_mb_cur_max;
-};
-
-#endif
diff --git a/lib/libc/citrus/citrus_none.c b/lib/libc/citrus/citrus_none.c
index b09a567ae04..98c0abeda8d 100644
--- a/lib/libc/citrus/citrus_none.c
+++ b/lib/libc/citrus/citrus_none.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: citrus_none.c,v 1.6 2015/11/01 03:45:28 guenther Exp $ */
+/* $OpenBSD: citrus_none.c,v 1.7 2016/09/05 09:47:03 schwarze Exp $ */
/* $NetBSD: citrus_none.c,v 1.18 2008/06/14 16:01:07 tnozaki Exp $ */
/*-
@@ -38,9 +38,6 @@
#include <wchar.h>
#include "citrus_ctype.h"
-#include "citrus_none.h"
-
-_CITRUS_CTYPE_DEF_OPS(none);
/*
* Convert an unsigned char value into a char value without relying on
@@ -57,13 +54,8 @@ wrapv(unsigned char ch)
size_t
_citrus_none_ctype_mbrtowc(wchar_t * __restrict pwc,
- const char * __restrict s, size_t n,
- void * __restrict pspriv)
+ const char * __restrict s, size_t n)
{
- /* pwc may be NULL */
- /* s may be NULL */
- /* pspriv appears to be unused */
-
if (s == NULL)
return 0;
if (n == 0)
@@ -73,23 +65,12 @@ _citrus_none_ctype_mbrtowc(wchar_t * __restrict pwc,
return (*s != '\0');
}
-int
-_citrus_none_ctype_mbsinit(const void * __restrict pspriv)
-{
- return (1); /* always initial state */
-}
-
size_t
_citrus_none_ctype_mbsnrtowcs(wchar_t * __restrict dst,
- const char ** __restrict src,
- size_t nmc, size_t len,
- void * __restrict pspriv)
+ const char ** __restrict src, size_t nmc, size_t len)
{
size_t i;
- /* dst may be NULL */
- /* pspriv appears to be unused */
-
if (dst == NULL)
return strnlen(*src, nmc);
@@ -104,12 +85,8 @@ _citrus_none_ctype_mbsnrtowcs(wchar_t * __restrict dst,
}
size_t
-_citrus_none_ctype_wcrtomb(char * __restrict s,
- wchar_t wc, void * __restrict pspriv)
+_citrus_none_ctype_wcrtomb(char * __restrict s, wchar_t wc)
{
- /* s may be NULL */
- /* ps appears to be unused */
-
if (s == NULL)
return (1);
@@ -124,15 +101,10 @@ _citrus_none_ctype_wcrtomb(char * __restrict s,
size_t
_citrus_none_ctype_wcsnrtombs(char * __restrict dst,
- const wchar_t ** __restrict src,
- size_t nwc, size_t len,
- void * __restrict pspriv)
+ const wchar_t ** __restrict src, size_t nwc, size_t len)
{
size_t i;
- /* dst may be NULL */
- /* pspriv appears to be unused */
-
if (dst == NULL) {
for (i = 0; i < nwc; i++) {
wchar_t wc = (*src)[i];
diff --git a/lib/libc/citrus/citrus_none.h b/lib/libc/citrus/citrus_none.h
deleted file mode 100644
index 6f74784b5a5..00000000000
--- a/lib/libc/citrus/citrus_none.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* $OpenBSD: citrus_none.h,v 1.2 2015/08/27 04:37:09 guenther Exp $ */
-/* $NetBSD: citrus_none.h,v 1.3 2003/06/25 09:51:38 tshiozak 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 _CITRUS_NONE_H_
-#define _CITRUS_NONE_H_
-
-__BEGIN_HIDDEN_DECLS
-extern struct _citrus_ctype_ops_rec _citrus_none_ctype_ops;
-
-_CITRUS_CTYPE_DECLS(none);
-__END_HIDDEN_DECLS
-
-#endif
diff --git a/lib/libc/citrus/citrus_utf8.c b/lib/libc/citrus/citrus_utf8.c
index 70ae39927b6..016e5d5428e 100644
--- a/lib/libc/citrus/citrus_utf8.c
+++ b/lib/libc/citrus/citrus_utf8.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: citrus_utf8.c,v 1.15 2015/11/01 03:45:28 guenther Exp $ */
+/* $OpenBSD: citrus_utf8.c,v 1.16 2016/09/05 09:47:03 schwarze Exp $ */
/*-
* Copyright (c) 2002-2004 Tim J. Robbins
@@ -38,12 +38,9 @@
#include <wchar.h>
#include "citrus_ctype.h"
-#include "citrus_utf8.h"
#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
-_CITRUS_CTYPE_DEF_OPS(utf8);
-
struct _utf8_state {
wchar_t ch;
int want;
@@ -52,14 +49,13 @@ struct _utf8_state {
size_t
_citrus_utf8_ctype_mbrtowc(wchar_t * __restrict pwc,
- const char * __restrict s, size_t n,
- void * __restrict pspriv)
+ const char * __restrict s, size_t n, mbstate_t * __restrict ps)
{
struct _utf8_state *us;
int ch, i, mask, want;
wchar_t lbound, wch;
- us = (struct _utf8_state *)pspriv;
+ us = (struct _utf8_state *)ps;
if (us->want < 0 || us->want > _CITRUS_UTF8_MB_CUR_MAX) {
errno = EINVAL;
@@ -182,22 +178,20 @@ _citrus_utf8_ctype_mbrtowc(wchar_t * __restrict pwc,
}
int
-_citrus_utf8_ctype_mbsinit(const void * __restrict pspriv)
+_citrus_utf8_ctype_mbsinit(const mbstate_t * __restrict ps)
{
- return (pspriv == NULL ||
- ((const struct _utf8_state *)pspriv)->want == 0);
+ return (((const struct _utf8_state *)ps)->want == 0);
}
size_t
_citrus_utf8_ctype_mbsnrtowcs(wchar_t * __restrict dst,
- const char ** __restrict src,
- size_t nmc, size_t len,
- void * __restrict pspriv)
+ const char ** __restrict src, size_t nmc, size_t len,
+ mbstate_t * __restrict ps)
{
struct _utf8_state *us;
size_t i, o, r;
- us = (struct _utf8_state *)pspriv;
+ us = (struct _utf8_state *)ps;
if (dst == NULL) {
/*
@@ -269,14 +263,14 @@ _citrus_utf8_ctype_mbsnrtowcs(wchar_t * __restrict dst,
}
size_t
-_citrus_utf8_ctype_wcrtomb(char * __restrict s,
- wchar_t wc, void * __restrict pspriv)
+_citrus_utf8_ctype_wcrtomb(char * __restrict s, wchar_t wc,
+ mbstate_t * __restrict ps)
{
struct _utf8_state *us;
unsigned char lead;
int i, len;
- us = (struct _utf8_state *)pspriv;
+ us = (struct _utf8_state *)ps;
if (us->want != 0) {
errno = EINVAL;
@@ -331,15 +325,14 @@ _citrus_utf8_ctype_wcrtomb(char * __restrict s,
size_t
_citrus_utf8_ctype_wcsnrtombs(char * __restrict dst,
- const wchar_t ** __restrict src,
- size_t nwc, size_t len,
- void * __restrict pspriv)
+ const wchar_t ** __restrict src, size_t nwc, size_t len,
+ mbstate_t * __restrict ps)
{
struct _utf8_state *us;
char buf[_CITRUS_UTF8_MB_CUR_MAX];
size_t i, o, r;
- us = (struct _utf8_state *)pspriv;
+ us = (struct _utf8_state *)ps;
if (us->want != 0) {
errno = EINVAL;
diff --git a/lib/libc/citrus/citrus_utf8.h b/lib/libc/citrus/citrus_utf8.h
deleted file mode 100644
index ee6634c76b6..00000000000
--- a/lib/libc/citrus/citrus_utf8.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* $OpenBSD: citrus_utf8.h,v 1.3 2015/08/27 04:37:09 guenther Exp $ */
-/* $NetBSD: citrus_utf8.h,v 1.2 2003/06/25 09:51:49 tshiozak 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 _CITRUS_UTF8_H_
-#define _CITRUS_UTF8_H_
-
-__BEGIN_HIDDEN_DECLS
-extern struct _citrus_ctype_ops_rec _citrus_utf8_ctype_ops;
-
-#define _CITRUS_UTF8_MB_CUR_MAX 4
-
-_CITRUS_CTYPE_DECLS(utf8);
-__END_HIDDEN_DECLS
-
-#endif
diff --git a/lib/libc/locale/multibyte.h b/lib/libc/locale/multibyte.h
deleted file mode 100644
index 9a69ada2751..00000000000
--- a/lib/libc/locale/multibyte.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $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
index 5e30f5bbee9..c4566579621 100644
--- a/lib/libc/locale/multibyte_citrus.c
+++ b/lib/libc/locale/multibyte_citrus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: multibyte_citrus.c,v 1.6 2015/09/12 16:23:14 guenther Exp $ */
+/* $OpenBSD: multibyte_citrus.c,v 1.7 2016/09/05 09:47:03 schwarze Exp $ */
/* $NetBSD: multibyte_amd1.c,v 1.7 2009/01/11 02:46:28 christos Exp $ */
/*-
@@ -28,28 +28,18 @@
*/
#include <sys/types.h>
-#include <errno.h>
#include <stdint.h>
+#include <stdlib.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)
+ if (ps == NULL || __mb_cur_max == 1)
return 1;
-
- rl = _ps_to_runelocale(ps);
- if (rl == NULL)
- rl = _CurrentRuneLocale;
- cc = rl->rl_citrus_ctype;
- return (*cc->cc_ops->co_mbsinit)(ps);
+ return _citrus_utf8_ctype_mbsinit(ps);
}
DEF_STRONG(mbsinit);
@@ -57,12 +47,12 @@ 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));
+ if (__mb_cur_max == 1)
+ return _citrus_none_ctype_mbrtowc(pwc, s, n);
+ return _citrus_utf8_ctype_mbrtowc(pwc, s, n, ps);
}
DEF_STRONG(mbrtowc);
@@ -82,13 +72,12 @@ mbsnrtowcs(wchar_t *dst, const char **src, size_t nmc, size_t len,
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_mbsnrtowcs)(dst, src, nmc, len,
- _ps_to_private(ps));
+ if (__mb_cur_max == 1)
+ return _citrus_none_ctype_mbsnrtowcs(dst, src, nmc, len);
+ return _citrus_utf8_ctype_mbsnrtowcs(dst, src, nmc, len, ps);
}
DEF_WEAK(mbsnrtowcs);
@@ -96,12 +85,12 @@ 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));
+ if (__mb_cur_max == 1)
+ return _citrus_none_ctype_wcrtomb(s, wc);
+ return _citrus_utf8_ctype_wcrtomb(s, wc, ps);
}
DEF_STRONG(wcrtomb);
@@ -121,12 +110,11 @@ wcsnrtombs(char *dst, const wchar_t **src, size_t nwc, size_t len,
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_wcsnrtombs)(dst, src, nwc, len,
- _ps_to_private(ps));
+ if (__mb_cur_max == 1)
+ return _citrus_none_ctype_wcsnrtombs(dst, src, nwc, len);
+ return _citrus_utf8_ctype_wcsnrtombs(dst, src, nwc, len, ps);
}
DEF_WEAK(wcsnrtombs);
diff --git a/lib/libc/locale/rune.c b/lib/libc/locale/rune.c
index 7774859df86..d5c3e5c0681 100644
--- a/lib/libc/locale/rune.c
+++ b/lib/libc/locale/rune.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rune.c,v 1.6 2016/02/05 04:10:48 jsg Exp $ */
+/* $OpenBSD: rune.c,v 1.7 2016/09/05 09:47:03 schwarze Exp $ */
/* $NetBSD: rune.c,v 1.26 2004/05/09 11:26:33 kleink Exp $ */
/*-
@@ -319,16 +319,3 @@ err:
free(hostdata);
return NULL;
}
-
-void
-_NukeRune(_RuneLocale *rl)
-{
-
- if (rl != &_DefaultRuneLocale) {
- _freeentry(&rl->rl_runetype_ext);
- free(rl->rl_tabs);
- free(rl->rl_codeset);
- free(rl);
- }
-}
-
diff --git a/lib/libc/locale/rune_local.h b/lib/libc/locale/rune_local.h
index 97491447955..7f2d5d90a5b 100644
--- a/lib/libc/locale/rune_local.h
+++ b/lib/libc/locale/rune_local.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: rune_local.h,v 1.4 2015/09/13 11:38:08 guenther Exp $ */
+/* $OpenBSD: rune_local.h,v 1.5 2016/09/05 09:47:03 schwarze Exp $ */
/* $NetBSD: rune_local.h,v 1.7 2003/03/02 22:18:15 tshiozak Exp $ */
/*-
@@ -34,7 +34,6 @@ __BEGIN_HIDDEN_DECLS
/* rune.c */
extern _RuneLocale *_Read_RuneMagi(FILE *fp);
-extern void _NukeRune(_RuneLocale *);
/* setrunelocale.c */
extern int _xpg4_setrunelocale(const char *);
diff --git a/lib/libc/locale/runetable.c b/lib/libc/locale/runetable.c
index 9f0bd4afc0b..ad4e22c9631 100644
--- a/lib/libc/locale/runetable.c
+++ b/lib/libc/locale/runetable.c
@@ -42,7 +42,6 @@
#include "rune.h"
#include "rune_local.h"
#include "citrus_ctype.h"
-#include "citrus_none.h"
_RuneLocale _DefaultRuneLocale = {
_RUNE_MAGIC_1,
@@ -249,7 +248,6 @@ _RuneLocale _DefaultRuneLocale = {
{ 0, NULL },
NULL, 0,
"US-ASCII",
- &_citrus_ctype_none,
{
{ NULL, NULL, NULL },
{ NULL, NULL, NULL },
diff --git a/lib/libc/locale/runetype.h b/lib/libc/locale/runetype.h
index c39ec6dce65..e12ed1f0818 100644
--- a/lib/libc/locale/runetype.h
+++ b/lib/libc/locale/runetype.h
@@ -1,7 +1,7 @@
#ifndef _NB_RUNETYPE_H_
#define _NB_RUNETYPE_H_
-/* $OpenBSD: runetype.h,v 1.7 2012/12/05 23:20:00 deraadt Exp $ */
+/* $OpenBSD: runetype.h,v 1.8 2016/09/05 09:47:03 schwarze Exp $ */
/* $NetBSD: runetype.h,v 1.18 2003/08/07 16:43:04 agc Exp $ */
/*-
* Copyright (c) 1993
@@ -199,7 +199,6 @@ typedef struct {
* the following portion is generated on the fly
*/
char *rl_codeset;
- struct _citrus_ctype_rec *rl_citrus_ctype;
_WCTransEntry rl_wctrans[_WCTRANS_NINDEXES];
_WCTypeEntry rl_wctype[_WCTYPE_NINDEXES];
diff --git a/lib/libc/locale/setrunelocale.c b/lib/libc/locale/setrunelocale.c
index 2ade6c4a84f..754a1b30dfe 100644
--- a/lib/libc/locale/setrunelocale.c
+++ b/lib/libc/locale/setrunelocale.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: setrunelocale.c,v 1.14 2016/09/02 15:00:14 schwarze Exp $ */
+/* $OpenBSD: setrunelocale.c,v 1.15 2016/09/05 09:47:03 schwarze Exp $ */
/* $NetBSD: setrunelocale.c,v 1.14 2003/08/07 16:43:07 agc Exp $ */
/*-
@@ -107,7 +107,6 @@ int
_newrunelocale(const char *path)
{
FILE *fp;
- _RuneLocale *rl;
if (_Utf8RuneLocale != NULL)
return 0;
@@ -115,20 +114,11 @@ _newrunelocale(const char *path)
if ((fp = fopen(path, "re")) == NULL)
return ENOENT;
- if ((rl = _Read_RuneMagi(fp)) == NULL) {
+ if ((_Utf8RuneLocale = _Read_RuneMagi(fp)) == NULL) {
fclose(fp);
return EFTYPE;
}
fclose(fp);
-
- rl->rl_citrus_ctype = NULL;
-
- if (_citrus_ctype_open(&rl->rl_citrus_ctype, rl->rl_encoding)) {
- _NukeRune(rl);
- return EINVAL;
- }
- _Utf8RuneLocale = rl;
-
return 0;
}
@@ -141,7 +131,8 @@ _xpg4_setrunelocale(const char *locname)
if (!strcmp(locname, "C") || !strcmp(locname, "POSIX")) {
_CurrentRuneLocale = &_DefaultRuneLocale;
- goto found;
+ __mb_cur_max = 1;
+ return 0;
}
/* Assumes "language[_territory][.codeset]" locale name. */
@@ -149,7 +140,8 @@ _xpg4_setrunelocale(const char *locname)
if (dot == NULL) {
/* No encoding specified. Fall back to ASCII. */
_CurrentRuneLocale = &_DefaultRuneLocale;
- goto found;
+ __mb_cur_max = 1;
+ return 0;
}
encoding = dot + 1;
@@ -167,9 +159,6 @@ _xpg4_setrunelocale(const char *locname)
if (_Utf8RuneLocale == NULL)
return ENOENT;
_CurrentRuneLocale = _Utf8RuneLocale;
-
-found:
- __mb_cur_max = _CurrentRuneLocale->rl_citrus_ctype->cc_mb_cur_max;
-
+ __mb_cur_max = _CITRUS_UTF8_MB_CUR_MAX;
return 0;
}