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