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