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