Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src add wcstod/wcstol/wcstoul.
details: https://anonhg.NetBSD.org/src/rev/7493479bf46a
branches: trunk
changeset: 515508:7493479bf46a
user: yamt <yamt%NetBSD.org@localhost>
date: Thu Sep 27 16:30:35 2001 +0000
description:
add wcstod/wcstol/wcstoul.
diffstat:
include/wchar.h | 7 +-
lib/libc/locale/Makefile.inc | 5 +-
lib/libc/locale/wcstod.c | 137 +++++++++++++++++++++++++++++++++++
lib/libc/locale/wcstol.c | 167 +++++++++++++++++++++++++++++++++++++++++++
lib/libc/locale/wcstoul.c | 130 +++++++++++++++++++++++++++++++++
5 files changed, 443 insertions(+), 3 deletions(-)
diffs (truncated from 486 to 300 lines):
diff -r 4e88164fb4cd -r 7493479bf46a include/wchar.h
--- a/include/wchar.h Thu Sep 27 15:29:06 2001 +0000
+++ b/include/wchar.h Thu Sep 27 16:30:35 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wchar.h,v 1.9 2000/12/29 15:26:33 kleink Exp $ */
+/* $NetBSD: wchar.h,v 1.10 2001/09/27 16:30:35 yamt Exp $ */
/*-
* Copyright (c)1999 Citrus Project,
@@ -129,6 +129,11 @@
size_t wcslcpy __P((wchar_t *, const wchar_t *, size_t));
int wcswidth __P((const wchar_t *, size_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));
+double wcstod __P((const wchar_t * __restrict, wchar_t ** __restrict));
__END_DECLS
#endif /* !_WCHAR_H_ */
diff -r 4e88164fb4cd -r 7493479bf46a lib/libc/locale/Makefile.inc
--- a/lib/libc/locale/Makefile.inc Thu Sep 27 15:29:06 2001 +0000
+++ b/lib/libc/locale/Makefile.inc Thu Sep 27 16:30:35 2001 +0000
@@ -1,12 +1,13 @@
# from: @(#)Makefile.inc 5.1 (Berkeley) 2/18/91
-# $NetBSD: Makefile.inc,v 1.35 2001/04/01 17:45:07 tshiozak Exp $
+# $NetBSD: Makefile.inc,v 1.36 2001/09/27 16:30:36 yamt 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
+ setlocale.c setlocale1.c setlocale32.c __mb_cur_max.c \
+ wcstol.c wcstoul.c wcstod.c
MAN+= nl_langinfo.3 setlocale.3
MLINKS+=setlocale.3 localeconv.3
diff -r 4e88164fb4cd -r 7493479bf46a lib/libc/locale/wcstod.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/locale/wcstod.c Thu Sep 27 16:30:35 2001 +0000
@@ -0,0 +1,137 @@
+/* $NetBSD: wcstod.c,v 1.1 2001/09/27 16:30:36 yamt Exp $ */
+
+/*-
+ * Copyright (c)1999, 2000, 2001 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.
+ *
+ * $Citrus: xpg4dl/FreeBSD/lib/libc/locale/wcstod.c,v 1.2 2001/09/27 16:23:57 yamt Exp $
+ */
+
+#include <sys/cdefs.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* XXX our lint can't handle wide char constant */
+#if defined(lint)
+#define _L(x) ((const wchar_t *)0)
+#define _LC(x) ((wchar_t)0)
+#else
+#define _L(x) __CONCAT(L,x)
+#define _LC(x) __CONCAT(L,x)
+#endif
+
+double
+wcstod(const wchar_t *nptr, wchar_t **endptr)
+{
+ const wchar_t *src;
+ size_t size;
+ const wchar_t *start;
+
+ _DIAGASSERT(nptr);
+
+ /*
+ * we do only check length of string
+ * and give it over strtod.
+ */
+ src = nptr;
+
+ /* skip space first */
+ while (iswspace(*src)) {
+ src++;
+ }
+
+ /* get length of string */
+ start = src;
+ if (wcschr(_L("+-"), *src))
+ src++;
+ size = wcsspn(src, _L("0123456789"));
+ src += size;
+ if (*src == _LC('.')) {/* XXX usr localeconv */
+ src++;
+ size = wcsspn(src, _L("0123456789"));
+ src += size;
+ }
+ if (wcschr(_L("Ee"), *src)) {
+ src++;
+ if (wcschr(_L("+-"), *src))
+ src++;
+ size = wcsspn(src, _L("0123456789"));
+ src += size;
+ }
+ size = src - start;
+
+ /*
+ * convert to a char-string and pass it to strtod.
+ *
+ * since all chars used to represent a double-constant
+ * are in the portable character set, we can assume
+ * that they are 1-byte chars.
+ */
+ if (size)
+ {
+ mbstate_t st;
+ char *buf;
+ char *end;
+ const wchar_t *s;
+ size_t size_converted;
+ double result;
+
+ buf = malloc(size + 1);
+ if (!buf) {
+ /* error */
+ errno = ENOMEM; /* XXX */
+ return 0;
+ }
+
+ s = start;
+ memset(&st, 0, sizeof(st));
+ size_converted = wcsrtombs(buf, &s, size, &st);
+ if (size != size_converted) {
+ /* XXX should not happen */
+ free(buf);
+ errno = EILSEQ;
+ return 0;
+ }
+
+ buf[size] = 0;
+ result = strtod(buf, &end);
+
+ free(buf);
+
+ if (endptr)
+ /* LINTED bad interface */
+ *endptr = (wchar_t*)start + (end - buf);
+
+ return result;
+ }
+
+ if (endptr)
+ /* LINTED bad interface */
+ *endptr = (wchar_t*)start;
+
+ return 0;
+}
diff -r 4e88164fb4cd -r 7493479bf46a lib/libc/locale/wcstol.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/locale/wcstol.c Thu Sep 27 16:30:35 2001 +0000
@@ -0,0 +1,167 @@
+/* $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 $ */
+
+/*-
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+#if 0
+static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: wcstol.c,v 1.1 2001/09/27 16:30:36 yamt Exp $");
+#endif
+#endif /* LIBC_SCCS and not lint */
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "__wctoint.h"
+
+/*
+ * Convert a wide-char string to a long integer.
+ */
+long
+wcstol(nptr, endptr, base)
+ const wchar_t *nptr;
+ wchar_t **endptr;
+ int base;
+{
+ const wchar_t *s;
+ long acc, cutoff;
+ wint_t wc;
+ int i;
+ int neg, any, cutlim;
+
+ _DIAGASSERT(nptr != NULL);
+ /* endptr may be NULL */
+
+ /* 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 == '0' ? 8 : 10;
+
+ /*
+ * Compute the cutoff value between legal numbers and illegal
+ * numbers. That is the largest legal value, divided by the
+ * base. An input number that is greater than this value, if
+ * followed by a legal input character, is too big. One that
+ * is equal to this value may be valid or not; the limit
+ * between valid and invalid numbers is then based on the last
+ * digit. For instance, if the range for longs is
+ * [-2147483648..2147483647] and the input base is 10,
+ * cutoff will be set to 214748364 and cutlim to either
Home |
Main Index |
Thread Index |
Old Index