Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Add mbsnrtowcs and wcsnrtombs. Approved by core.
details: https://anonhg.NetBSD.org/src/rev/bab403d6624e
branches: trunk
changeset: 786993:bab403d6624e
user: joerg <joerg%NetBSD.org@localhost>
date: Tue May 28 16:57:56 2013 +0000
description:
Add mbsnrtowcs and wcsnrtombs. Approved by core.
diffstat:
distrib/sets/lists/debug/mi | 3 +-
distrib/sets/lists/tests/mi | 3 +-
include/wchar.h | 11 +-
lib/libc/citrus/citrus_ctype.c | 8 +-
lib/libc/citrus/citrus_ctype.h | 22 +++-
lib/libc/citrus/citrus_ctype_fallback.c | 123 ++++++++++++++++++++-
lib/libc/citrus/citrus_ctype_fallback.h | 14 ++-
lib/libc/citrus/citrus_ctype_local.h | 36 +++++-
lib/libc/citrus/citrus_ctype_template.h | 177 +++++++++++++++++++++++++++++-
lib/libc/citrus/citrus_none.c | 87 ++++++++++++++-
lib/libc/citrus/modules/citrus_big5.c | 6 +-
lib/libc/citrus/modules/citrus_dechanyu.c | 6 +-
lib/libc/citrus/modules/citrus_euc.c | 6 +-
lib/libc/citrus/modules/citrus_euctw.c | 6 +-
lib/libc/citrus/modules/citrus_gbk2k.c | 6 +-
lib/libc/citrus/modules/citrus_hz.c | 6 +-
lib/libc/citrus/modules/citrus_iso2022.c | 6 +-
lib/libc/citrus/modules/citrus_johab.c | 6 +-
lib/libc/citrus/modules/citrus_mskanji.c | 6 +-
lib/libc/citrus/modules/citrus_ues.c | 6 +-
lib/libc/citrus/modules/citrus_utf7.c | 6 +-
lib/libc/citrus/modules/citrus_utf8.c | 6 +-
lib/libc/citrus/modules/citrus_viqr.c | 6 +-
lib/libc/citrus/modules/citrus_zw.c | 6 +-
lib/libc/locale/multibyte_amd1.c | 27 ++++-
lib/libc/locale/multibyte_c90.c | 31 ++++-
tests/lib/libc/locale/Makefile | 3 +-
tests/lib/libc/locale/t_mbsnrtowcs.c | 97 ++++++++++++++++
28 files changed, 672 insertions(+), 54 deletions(-)
diffs (truncated from 1414 to 300 lines):
diff -r 9e618abd8834 -r bab403d6624e distrib/sets/lists/debug/mi
--- a/distrib/sets/lists/debug/mi Tue May 28 15:25:37 2013 +0000
+++ b/distrib/sets/lists/debug/mi Tue May 28 16:57:56 2013 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.22 2013/05/08 17:41:31 christos Exp $
+# $NetBSD: mi,v 1.23 2013/05/28 16:57:56 joerg Exp $
./etc/mtree/set.debug comp-sys-root
./usr/libdata/debug/bin/cat.debug comp-util-debug debug
./usr/libdata/debug/bin/chio.debug comp-util-debug debug
@@ -1543,6 +1543,7 @@
./usr/libdata/debug/usr/tests/lib/libc/locale/t_io.debug tests-lib-debug debug,atf
./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbrtowc.debug tests-lib-debug debug,atf
./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbstowcs.debug tests-lib-debug debug,atf
+./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbsnrtowcs.debug tests-lib-debug debug,atf
./usr/libdata/debug/usr/tests/lib/libc/locale/t_mbtowc.debug tests-lib-debug debug,atf
./usr/libdata/debug/usr/tests/lib/libc/locale/t_wcscspn.debug tests-lib-debug debug,atf
./usr/libdata/debug/usr/tests/lib/libc/locale/t_wcspbrk.debug tests-lib-debug debug,atf
diff -r 9e618abd8834 -r bab403d6624e distrib/sets/lists/tests/mi
--- a/distrib/sets/lists/tests/mi Tue May 28 15:25:37 2013 +0000
+++ b/distrib/sets/lists/tests/mi Tue May 28 16:57:56 2013 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.535 2013/04/22 21:06:28 christos Exp $
+# $NetBSD: mi,v 1.536 2013/05/28 16:57:56 joerg Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -1942,6 +1942,7 @@
./usr/tests/lib/libc/locale/t_io tests-lib-tests atf
./usr/tests/lib/libc/locale/t_mbrtowc tests-lib-tests atf
./usr/tests/lib/libc/locale/t_mbstowcs tests-lib-tests atf
+./usr/tests/lib/libc/locale/t_mbsnrtowcs tests-lib-tests atf
./usr/tests/lib/libc/locale/t_mbtowc tests-lib-tests atf
./usr/tests/lib/libc/locale/t_wcscspn tests-lib-tests atf
./usr/tests/lib/libc/locale/t_wcspbrk tests-lib-tests atf
diff -r 9e618abd8834 -r bab403d6624e include/wchar.h
--- a/include/wchar.h Tue May 28 15:25:37 2013 +0000
+++ b/include/wchar.h Tue May 28 16:57:56 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wchar.h,v 1.37 2013/04/19 23:45:15 joerg Exp $ */
+/* $NetBSD: wchar.h,v 1.38 2013/05/28 16:57:56 joerg Exp $ */
/*-
* Copyright (c)1999 Citrus Project,
@@ -212,6 +212,11 @@
# define __LOCALE_T_DECLARED
# endif
__BEGIN_DECLS
+size_t mbsnrtowcs(wchar_t * __restrict, const char ** __restrict, size_t,
+ size_t, mbstate_t * __restrict);
+size_t wcsnrtombs(char * __restrict, const wchar_t ** __restrict, size_t,
+ size_t, mbstate_t * __restrict);
+
int wcscoll_l(const wchar_t *, const wchar_t *, locale_t);
size_t wcsxfrm_l(wchar_t *, const wchar_t *, size_t, locale_t);
int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t);
@@ -246,9 +251,13 @@
int mbsinit_l(const mbstate_t *, locale_t);
size_t mbsrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t,
mbstate_t * __restrict, locale_t);
+size_t mbsnrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t,
+ size_t, mbstate_t * __restrict, locale_t);
size_t wcrtomb_l(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t);
size_t wcsrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t,
mbstate_t * __restrict, locale_t);
+size_t wcsnrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t,
+ size_t, mbstate_t * __restrict, locale_t);
int wctob_l(wint_t, locale_t);
int fwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, ...);
diff -r 9e618abd8834 -r bab403d6624e lib/libc/citrus/citrus_ctype.c
--- a/lib/libc/citrus/citrus_ctype.c Tue May 28 15:25:37 2013 +0000
+++ b/lib/libc/citrus/citrus_ctype.c Tue May 28 16:57:56 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_ctype.c,v 1.6 2011/11/19 18:34:21 tnozaki Exp $ */
+/* $NetBSD: citrus_ctype.c,v 1.7 2013/05/28 16:57:56 joerg Exp $ */
/*-
* Copyright (c)1999, 2000, 2001, 2002 Citrus Project,
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_ctype.c,v 1.6 2011/11/19 18:34:21 tnozaki Exp $");
+__RCSID("$NetBSD: citrus_ctype.c,v 1.7 2013/05/28 16:57:56 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -92,6 +92,8 @@
cc->cc_ops->co_wctob = &_citrus_ctype_wctob_fallback;
/* FALLTHROUGH */
case 0x00000002:
+ cc->cc_ops->co_mbsnrtowcs = &_citrus_ctype_mbsnrtowcs_fallback;
+ cc->cc_ops->co_wcsnrtombs = &_citrus_ctype_wcsnrtombs_fallback;
/* FALLTHROUGH */
default:
break;
@@ -106,10 +108,12 @@
cc->cc_ops->co_mbrtowc == NULL ||
cc->cc_ops->co_mbsinit == NULL ||
cc->cc_ops->co_mbsrtowcs == NULL ||
+ cc->cc_ops->co_mbsnrtowcs == NULL ||
cc->cc_ops->co_mbstowcs == NULL ||
cc->cc_ops->co_mbtowc == NULL ||
cc->cc_ops->co_wcrtomb == NULL ||
cc->cc_ops->co_wcsrtombs == NULL ||
+ cc->cc_ops->co_wcsnrtombs == NULL ||
cc->cc_ops->co_wcstombs == NULL ||
cc->cc_ops->co_wctomb == NULL ||
cc->cc_ops->co_btowc == NULL ||
diff -r 9e618abd8834 -r bab403d6624e lib/libc/citrus/citrus_ctype.h
--- a/lib/libc/citrus/citrus_ctype.h Tue May 28 15:25:37 2013 +0000
+++ b/lib/libc/citrus/citrus_ctype.h Tue May 28 16:57:56 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_ctype.h,v 1.2 2003/03/05 20:18:15 tshiozak Exp $ */
+/* $NetBSD: citrus_ctype.h,v 1.3 2013/05/28 16:57:56 joerg Exp $ */
/*-
* Copyright (c)2002 Citrus Project,
@@ -95,6 +95,16 @@
}
static __inline int
+_citrus_ctype_mbsnrtowcs(_citrus_ctype_t cc, wchar_t *pwcs, const char **s,
+ size_t in, size_t n, void *pspriv, size_t *nresult)
+{
+
+ _DIAGASSERT(cc && cc->cc_ops && cc->cc_ops->co_mbsnrtowcs && nresult);
+ return (*cc->cc_ops->co_mbsnrtowcs)(cc, pwcs, s, in, n,
+ pspriv, nresult);
+}
+
+static __inline int
_citrus_ctype_mbstowcs(_citrus_ctype_t cc, wchar_t *pwcs, const char *s,
size_t n, size_t *nresult)
{
@@ -133,6 +143,16 @@
}
static __inline int
+_citrus_ctype_wcsnrtombs(_citrus_ctype_t cc, char *s, const wchar_t **ppwcs,
+ size_t in, size_t n, void *pspriv, size_t *nresult)
+{
+
+ _DIAGASSERT(cc && cc->cc_ops && cc->cc_ops->co_wcsnrtombs && nresult);
+ return (*cc->cc_ops->co_wcsnrtombs)(cc, s, ppwcs, in, n,
+ pspriv, nresult);
+}
+
+static __inline int
_citrus_ctype_wcstombs(_citrus_ctype_t cc, char *s, const wchar_t *wcs,
size_t n, size_t *nresult)
{
diff -r 9e618abd8834 -r bab403d6624e lib/libc/citrus/citrus_ctype_fallback.c
--- a/lib/libc/citrus/citrus_ctype_fallback.c Tue May 28 15:25:37 2013 +0000
+++ b/lib/libc/citrus/citrus_ctype_fallback.c Tue May 28 16:57:56 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_ctype_fallback.c,v 1.2 2003/06/27 14:52:25 yamt Exp $ */
+/* $NetBSD: citrus_ctype_fallback.c,v 1.3 2013/05/28 16:57:56 joerg Exp $ */
/*-
* Copyright (c)2003 Citrus Project,
@@ -28,13 +28,14 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_ctype_fallback.c,v 1.2 2003/06/27 14:52:25 yamt Exp $");
+__RCSID("$NetBSD: citrus_ctype_fallback.c,v 1.3 2013/05/28 16:57:56 joerg Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
#include <sys/types.h>
#include <assert.h>
+#include <errno.h>
#include <wchar.h>
#include <stdio.h>
#include <string.h>
@@ -108,3 +109,121 @@
return 0;
}
+
+/*
+ * for ABI version >= 0x00000003
+ */
+
+int
+_citrus_ctype_mbsnrtowcs_fallback(_citrus_ctype_rec_t * __restrict cc,
+ wchar_t * __restrict pwcs, const char ** __restrict s, size_t in,
+ size_t n, void * __restrict psenc, size_t * __restrict nresult)
+{
+ int err;
+ size_t cnt, siz;
+ const char *s0, *se;
+
+ _DIAGASSERT(nresult != 0);
+ _DIAGASSERT(psenc != NULL);
+ _DIAGASSERT(s != NULL);
+ _DIAGASSERT(*s != NULL);
+
+ /* if pwcs is NULL, ignore n */
+ if (pwcs == NULL)
+ n = 1; /* arbitrary >0 value */
+
+ err = 0;
+ cnt = 0;
+ se = *s + in;
+ s0 = *s; /* to keep *s unchanged for now, use copy instead. */
+ while (s0 < se && n > 0) {
+ err = _citrus_ctype_mbrtowc(cc, pwcs, s0, (size_t)(se - s0),
+ psenc, &siz);
+ if (err) {
+ cnt = (size_t)-1;
+ goto bye;
+ }
+ if (siz == (size_t)-2) {
+ s0 = se;
+ goto bye;
+ }
+ switch (siz) {
+ case 0:
+ if (pwcs) {
+ size_t dum;
+ _citrus_ctype_mbrtowc(cc, NULL, NULL, 0, psenc,
+ &dum);
+ }
+ s0 = 0;
+ goto bye;
+ default:
+ if (pwcs) {
+ pwcs++;
+ n--;
+ }
+ s0 += siz;
+ cnt++;
+ break;
+ }
+ }
+bye:
+ if (pwcs)
+ *s = s0;
+
+ *nresult = cnt;
+
+ return err;
+}
+
+int
+_citrus_ctype_wcsnrtombs_fallback(_citrus_ctype_rec_t * __restrict cc,
+ char * __restrict s, const wchar_t ** __restrict pwcs, size_t in,
+ size_t n, void * __restrict psenc, size_t * __restrict nresult)
+{
+ size_t cnt = 0;
+ int err;
+ char buf[MB_LEN_MAX];
+ size_t siz;
+ const wchar_t* pwcs0;
+ mbstate_t state;
+
+ pwcs0 = *pwcs;
+
+ if (!s)
+ n = 1;
+
+ while (in > 0 && n > 0) {
+ memcpy(&state, psenc, sizeof(state));
+ err = _citrus_ctype_wcrtomb(cc, buf, *pwcs0, psenc, &siz);
+ if (siz == (size_t)-1) {
+ *nresult = siz;
+ return (err);
+ }
+
+ if (s) {
+ if (n < siz) {
+ memcpy(psenc, &state, sizeof(state));
+ break;
+ }
+ memcpy(s, buf, siz);
+ s += siz;
+ n -= siz;
+ }
+ cnt += siz;
+ if (!*pwcs0) {
+ if (s) {
+ memset(psenc, 0, sizeof(state));
+ }
+ pwcs0 = 0;
+ cnt--; /* don't include terminating null */
+ break;
+ }
+ pwcs0++;
+ --in;
+ }
+ if (s)
+ *pwcs = pwcs0;
+
+ *nresult = cnt;
+ return (0);
+}
diff -r 9e618abd8834 -r bab403d6624e lib/libc/citrus/citrus_ctype_fallback.h
Home |
Main Index |
Thread Index |
Old Index