Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src add wcstoll, wcstoimax, wcstoull and wcstoumax. (lib/20656)



details:   https://anonhg.NetBSD.org/src/rev/5f50dc6f80c6
branches:  trunk
changeset: 544092:5f50dc6f80c6
user:      tshiozak <tshiozak%NetBSD.org@localhost>
date:      Tue Mar 11 09:21:22 2003 +0000

description:
add wcstoll, wcstoimax, wcstoull and wcstoumax. (lib/20656)
  - these are defined in C99 (wcsto[ui]max) and SUSv3.
  - these implementations are written by sigsegv%s25.xrea.com@localhost,
    derived from NetBSD's wcstol/wcstoul.
  - I just added some comments.

diffstat:

 include/inttypes.h           |    7 +-
 include/wchar.h              |   19 ++++-
 lib/libc/locale/Makefile.inc |    5 +-
 lib/libc/locale/_wcstol.h    |  149 ++++++++++++++++++++++++++++++++++++++++
 lib/libc/locale/_wcstoul.h   |  125 ++++++++++++++++++++++++++++++++++
 lib/libc/locale/wcstoimax.c  |   24 ++++++
 lib/libc/locale/wcstol.c     |  158 +-----------------------------------------
 lib/libc/locale/wcstoll.c    |   23 ++++++
 lib/libc/locale/wcstoul.c    |  120 +-------------------------------
 lib/libc/locale/wcstoull.c   |   22 +++++
 lib/libc/locale/wcstoumax.c  |   23 ++++++
 11 files changed, 403 insertions(+), 272 deletions(-)

diffs (truncated from 779 to 300 lines):

diff -r 859c819eea5a -r 5f50dc6f80c6 include/inttypes.h
--- a/include/inttypes.h        Tue Mar 11 07:18:38 2003 +0000
+++ b/include/inttypes.h        Tue Mar 11 09:21:22 2003 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: inttypes.h,v 1.1 2001/04/28 15:41:28 kleink Exp $      */
+/*     $NetBSD: inttypes.h,v 1.2 2003/03/11 09:21:22 tshiozak Exp $    */
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -41,12 +41,17 @@
 
 #include <sys/cdefs.h>
 #include <sys/inttypes.h>
+#include <wchar.h>
 
 __BEGIN_DECLS
 intmax_t       strtoimax __P((const char * __restrict,
                    char ** __restrict, int));
 uintmax_t      strtoumax __P((const char * __restrict,
                    char ** __restrict, int));
+intmax_t       wcstoimax __P((const wchar_t * __restrict,
+                   wchar_t ** __restrict, int));
+uintmax_t      wcstoumax __P((const wchar_t * __restrict,
+                   wchar_t ** __restrict, int));
 __END_DECLS
 
 #endif /* !_INTTYPES_H_ */
diff -r 859c819eea5a -r 5f50dc6f80c6 include/wchar.h
--- a/include/wchar.h   Tue Mar 11 07:18:38 2003 +0000
+++ b/include/wchar.h   Tue Mar 11 09:21:22 2003 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: wchar.h,v 1.16 2003/03/07 07:11:35 tshiozak Exp $      */
+/*     $NetBSD: wchar.h,v 1.17 2003/03/11 09:21:22 tshiozak Exp $      */
 
 /*-
  * Copyright (c)1999 Citrus Project,
@@ -144,11 +144,22 @@
 int    wctob __P((wint_t));
 int    wcwidth __P((wchar_t));
 
-unsigned long int wcstoul __P((const wchar_t * __restrict, wchar_t ** __restrict,
-               int base));
-long int wcstol __P((const wchar_t * __restrict, wchar_t ** __restrict, int base));
+unsigned long int wcstoul __P((const wchar_t * __restrict,
+       wchar_t ** __restrict, int base));
+long int wcstol __P((const wchar_t * __restrict,
+       wchar_t ** __restrict, int base));
 double wcstod __P((const wchar_t * __restrict, wchar_t ** __restrict));
 
+#if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || \
+    defined(_ISOC99_SOURCE) || (__STDC_VERSION__ - 0) > 199901L
+/* LONGLONG */
+long long int wcstoll __P((const wchar_t * __restrict,
+       wchar_t ** __restrict, int base));
+/* LONGLONG */
+unsigned long long int wcstoull __P((const wchar_t * __restrict,
+       wchar_t ** __restrict, int base));
+#endif
+
 wint_t ungetwc __P((wint_t, FILE *));
 wint_t fgetwc __P((FILE *));
 wchar_t *fgetws __P((wchar_t * __restrict, int, FILE * __restrict));
diff -r 859c819eea5a -r 5f50dc6f80c6 lib/libc/locale/Makefile.inc
--- a/lib/libc/locale/Makefile.inc      Tue Mar 11 07:18:38 2003 +0000
+++ b/lib/libc/locale/Makefile.inc      Tue Mar 11 09:21:22 2003 +0000
@@ -1,12 +1,13 @@
 #      from: @(#)Makefile.inc  5.1 (Berkeley) 2/18/91
-#      $NetBSD: Makefile.inc,v 1.44 2003/03/05 20:18:16 tshiozak Exp $
+#      $NetBSD: Makefile.inc,v 1.45 2003/03/11 09:21:23 tshiozak Exp $
 
 # locale sources
 .PATH: ${ARCHDIR}/locale ${.CURDIR}/locale
 
 SRCS+= _def_messages.c _def_monetary.c _def_numeric.c _def_time.c \
        ctypeio.c localeconv.c nl_langinfo.c setlocale.c setlocale1.c \
-       setlocale32.c __mb_cur_max.c wcscoll.c wcstol.c wcstoul.c wcstod.c \
+       setlocale32.c __mb_cur_max.c wcscoll.c wcstod.c \
+       wcstol.c wcstoll.c wcstoimax.c wcstoul.c wcstoull.c wcstoumax.c \
        wcsxfrm.c aliasname.c
 MAN+=  nl_langinfo.3 setlocale.3
 
diff -r 859c819eea5a -r 5f50dc6f80c6 lib/libc/locale/_wcstol.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/locale/_wcstol.h Tue Mar 11 09:21:22 2003 +0000
@@ -0,0 +1,149 @@
+/* $NetBSD: _wcstol.h,v 1.1 2003/03/11 09:21:23 tshiozak Exp $ */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. 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.
+ *
+ * Original version ID:
+ * @(#)strtol.c        8.1 (Berkeley) 6/4/93
+ * NetBSD: wcstol.c,v 1.1 2001/09/27 16:30:36 yamt Exp
+ * Citrus: xpg4dl/FreeBSD/lib/libc/locale/wcstol.c,v 1.2 2001/09/21 16:11:41 yamt Exp
+ */
+
+/*
+ * function template for wcstol, wcstoll and wcstoimax.
+ *
+ * parameters:
+ *     _FUNCNAME : function name
+ *      __INT     : return type
+ *      __INT_MIN : lower limit of the return type
+ *      __INT_MAX : upper limit of the return type
+ */
+
+__INT
+_FUNCNAME(nptr, endptr, base)
+       const wchar_t *nptr;
+       wchar_t **endptr;
+       int base;
+{
+       const wchar_t *s;
+       __INT acc, cutoff;
+       wint_t wc;
+       int i;
+       int neg, any, cutlim;
+
+       _DIAGASSERT(nptr != NULL);
+       /* endptr may be NULL */
+
+#ifdef __GNUC__
+       (void)&acc; (void)&cutoff;
+#endif
+
+       /* check base value */
+       if (base && (base < 2 || base > 36)) {
+               errno = EINVAL;
+               return 0;
+       }
+
+       /*
+        * Skip white space and pick up leading +/- sign if any.
+        * If base is 0, allow 0x for hex and 0 for octal, else
+        * assume decimal; if base is already 16, allow 0x.
+        */
+       s = nptr;
+       do {
+               wc = (wchar_t) *s++;
+       } while (iswspace(wc));
+       if (wc == L'-') {
+               neg = 1;
+               wc = *s++;
+       } else {
+               neg = 0;
+               if (wc == L'+')
+                       wc = *s++;
+       }
+       if ((base == 0 || base == 16) &&
+           wc == L'0' && (*s == L'x' || *s == L'X')) {
+               wc = s[1];
+               s += 2;
+               base = 16;
+       }
+       if (base == 0)
+               base = wc == L'0' ? 8 : 10;
+
+       /*
+        * See strtol for comments as to the logic used.
+        */
+       cutoff = neg ? __INT_MIN : __INT_MAX;
+       cutlim = (int)(cutoff % base);
+       cutoff /= base;
+       if (neg) {
+               if (cutlim > 0) {
+                       cutlim -= base;
+                       cutoff += 1;
+               }
+               cutlim = -cutlim;
+       }
+       for (acc = 0, any = 0;; wc = (wchar_t) *s++) {
+               i = __wctoint(wc);
+               if (i == -1)
+                       break;
+               if (i >= base)
+                       break;
+               if (any < 0)
+                       continue;
+               if (neg) {
+                       if (acc < cutoff || (acc == cutoff && i > cutlim)) {
+                               any = -1;
+                               acc = __INT_MIN;
+                               errno = ERANGE;
+                       } else {
+                               any = 1;
+                               acc *= base;
+                               acc -= i;
+                       }
+               } else {
+                       if (acc > cutoff || (acc == cutoff && i > cutlim)) {
+                               any = -1;
+                               acc = __INT_MAX;
+                               errno = ERANGE;
+                       } else {
+                               any = 1;
+                               acc *= base;
+                               acc += i;
+                       }
+               }
+       }
+       if (endptr != 0)
+               /* LINTED interface specification */
+               *endptr = (wchar_t *)(any ? s - 1 : nptr);
+       return (acc);
+}
diff -r 859c819eea5a -r 5f50dc6f80c6 lib/libc/locale/_wcstoul.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/locale/_wcstoul.h        Tue Mar 11 09:21:22 2003 +0000
@@ -0,0 +1,125 @@
+/* $NetBSD: _wcstoul.h,v 1.1 2003/03/11 09:21:23 tshiozak Exp $ */
+
+/*
+ * Copyright (c) 1990, 1993
+ *     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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. 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.
+ *
+ * Original version ID:
+ * @(#)strtoul.c       8.1 (Berkeley) 6/4/93
+ * Citrus: xpg4dl/FreeBSD/lib/libc/locale/wcstoul.c,v 1.2 2001/09/21 16:11:41 yamt Exp
+ * NetBSD: wcstoul.c,v 1.1 2001/09/27 16:30:37 yamt Exp
+ */
+
+/*
+ * function template for wcstoul, wcstoull and wcstoumax.
+ *
+ * parameters:
+ *     _FUNCNAME  : function name
+ *      __UINT     : return type
+ *      __UINT_MAX : upper limit of the return type
+ */
+
+__UINT
+_FUNCNAME(nptr, endptr, base)
+       const wchar_t *nptr;
+       wchar_t **endptr;
+       int base;
+{
+       const wchar_t *s;
+       __UINT acc, cutoff;
+       wint_t wc;
+       int i;
+       int neg, any, cutlim;
+
+       _DIAGASSERT(nptr != NULL);



Home | Main Index | Thread Index | Old Index