This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Importing inttypes methods from FreeBSD


Hello All,

This is the modified patches for inttypes methods. Now I want to make
testsuite for these methods in newlib, but i have no idea how to make
test in newlib. Can anyone please help me for the same or point me
some link. Please review the patch.

Thanks & Regards,
Aditya Upadhyay

On Wed, Jul 19, 2017 at 10:30 PM, Aditya Upadhyay <aadit0402@gmail.com> wrote:
> I am attaching the patch for inttypes methods after modification. I am
> requesting you to please review the same.
>
> Regards,
> Aditya
>
> On Wed, Jul 19, 2017 at 9:14 PM, Corinna Vinschen <vinschen@redhat.com> wrote:
>> On Jul 19 10:13, Craig Howland wrote:
>>> On 07/19/2017 08:28 AM, Corinna Vinschen wrote:
>>> > What you really want is to define a static function which takes the
>>> > reent pointer and strtoimax_l/strtoimax only calling that, like this:
>>> >
>>> > --- snip ---
>>> > static intmax_t
>>> > _strtoimax_r(struct _reent *rptr, const char * __restrict nptr,
>>> >          char ** __restrict endptr, int base, locale_t loc)
>>> Corinna:
>>>      Why static?  In general, the reentrant forms are included in the header
>>> files so that they can be called directly if an application so desires.
>>
>> Good point.  Yes, the function should better be non-static and added
>> to inttypes.h as well (unconditionally).
>>
>>
>> Corinna
>>
>> --
>> Corinna Vinschen
>> Cygwin Maintainer
>> Red Hat
From 259ca4539ee8f4a54e1caa97bcfd000c442ab0d6 Mon Sep 17 00:00:00 2001
From: Aditya Upadhyay <aadit0402@gmail.com>
Date: Thu, 20 Jul 2017 13:33:28 +0530
Subject: [PATCH 1/6] importing of imaxabs inttypes method from FreeBSD.

---
 newlib/libc/stdlib/Makefile.am | 6 ++----
 newlib/libc/stdlib/imaxabs.c   | 5 ++---
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am
index 6cca5f005..d97b0250c 100644
--- a/newlib/libc/stdlib/Makefile.am
+++ b/newlib/libc/stdlib/Makefile.am
@@ -34,7 +34,6 @@ GENERAL_SOURCES = \
 	getenv_r.c	\
 	itoa.c          \
 	imaxabs.c	\
-	imaxdiv.c	\
 	labs.c 		\
 	ldiv.c  	\
 	ldtoa.c		\
@@ -59,7 +58,6 @@ GENERAL_SOURCES = \
 	sb_charsets.c	\
 	strtod.c	\
 	strtodg.c	\
-	strtoimax.c	\
 	strtol.c	\
 	strtorx.c	\
 	strtoul.c	\
@@ -70,8 +68,8 @@ GENERAL_SOURCES = \
 	wcstombs.c	\
 	wcstombs_r.c	\
 	wctomb.c	\
-	wctomb_r.c
-
+	wctomb_r.c	\
+	
 if HAVE_LONG_DOUBLE
 GENERAL_SOURCES += \
 	strtold.c \
diff --git a/newlib/libc/stdlib/imaxabs.c b/newlib/libc/stdlib/imaxabs.c
index 0c76e0cbe..e43864606 100644
--- a/newlib/libc/stdlib/imaxabs.c
+++ b/newlib/libc/stdlib/imaxabs.c
@@ -25,11 +25,10 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/libc/stdlib/imaxabs.c 86368 2001-11-15 02:05:03Z mike $");
 
-#include <stdint.h>
 #include <inttypes.h>
-
+#include <stdint.h>
 intmax_t
 imaxabs(intmax_t j)
 {
-- 
2.11.0

From aba3f506c36b0bc5027db296019e12df2f39cad8 Mon Sep 17 00:00:00 2001
From: Aditya Upadhyay <aadit0402@gmail.com>
Date: Thu, 20 Jul 2017 13:34:40 +0530
Subject: [PATCH 2/6] Importing of imaxdiv inttypes method from FreeBSD.

---
 newlib/libc/stdlib/Makefile.am | 1 +
 newlib/libc/stdlib/imaxdiv.c   | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am
index d97b0250c..534a867b1 100644
--- a/newlib/libc/stdlib/Makefile.am
+++ b/newlib/libc/stdlib/Makefile.am
@@ -34,6 +34,7 @@ GENERAL_SOURCES = \
 	getenv_r.c	\
 	itoa.c          \
 	imaxabs.c	\
+	imaxdiv.c	\
 	labs.c 		\
 	ldiv.c  	\
 	ldtoa.c		\
diff --git a/newlib/libc/stdlib/imaxdiv.c b/newlib/libc/stdlib/imaxdiv.c
index 15d78baf4..eb3e99ad6 100644
--- a/newlib/libc/stdlib/imaxdiv.c
+++ b/newlib/libc/stdlib/imaxdiv.c
@@ -25,10 +25,10 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/libc/stdlib/imaxdiv.c 301115 2016-06-01 10:14:25Z ache $");
 
-#include <stdint.h>
 #include <inttypes.h>
+#include <stdint.h>
 
 /* See comments in div.c for implementation details. */
 imaxdiv_t
-- 
2.11.0

From c673221f773a0a733964653e8d53580f040d6dff Mon Sep 17 00:00:00 2001
From: Aditya Upadhyay <aadit0402@gmail.com>
Date: Thu, 20 Jul 2017 13:36:05 +0530
Subject: [PATCH 3/6] Importing strtoimax inttypes method from FreeBSD.

---
 newlib/libc/stdlib/Makefile.am | 1 +
 newlib/libc/stdlib/strtoimax.c | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am
index 534a867b1..30723ed2a 100644
--- a/newlib/libc/stdlib/Makefile.am
+++ b/newlib/libc/stdlib/Makefile.am
@@ -59,6 +59,7 @@ GENERAL_SOURCES = \
 	sb_charsets.c	\
 	strtod.c	\
 	strtodg.c	\
+	strtoimax.c	\
 	strtol.c	\
 	strtorx.c	\
 	strtoul.c	\
diff --git a/newlib/libc/stdlib/strtoimax.c b/newlib/libc/stdlib/strtoimax.c
index 3e38b850e..82de47c9a 100644
--- a/newlib/libc/stdlib/strtoimax.c
+++ b/newlib/libc/stdlib/strtoimax.c
@@ -148,5 +148,5 @@ strtoimax_l(const char * __restrict nptr, char ** __restrict endptr, int base,
 intmax_t
 strtoimax(const char* __restrict nptr, char** __restrict endptr, int base)
 {
-	return _strtoimax_r(_REENT,nptr,endptr, base, __get_current_locale());
+	return _strtoimax_r(_REENT, nptr, endptr, base, __get_current_locale());
 }		
-- 
2.11.0

From 17b233a032933cfd2da8280760a21411c8622601 Mon Sep 17 00:00:00 2001
From: Aditya Upadhyay <aadit0402@gmail.com>
Date: Thu, 20 Jul 2017 13:37:15 +0530
Subject: [PATCH 4/6] Importing strtoumax inttypes method from FreeBSD.

---
 newlib/libc/stdlib/Makefile.am |   1 +
 newlib/libc/stdlib/strtoumax.c | 134 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 135 insertions(+)
 create mode 100644 newlib/libc/stdlib/strtoumax.c

diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am
index 30723ed2a..7e6784758 100644
--- a/newlib/libc/stdlib/Makefile.am
+++ b/newlib/libc/stdlib/Makefile.am
@@ -63,6 +63,7 @@ GENERAL_SOURCES = \
 	strtol.c	\
 	strtorx.c	\
 	strtoul.c	\
+	strtoumax.c	\
 	utoa.c          \
 	wcstod.c	\
 	wcstol.c	\
diff --git a/newlib/libc/stdlib/strtoumax.c b/newlib/libc/stdlib/strtoumax.c
new file mode 100644
index 000000000..e959a7ddb
--- /dev/null
+++ b/newlib/libc/stdlib/strtoumax.c
@@ -0,0 +1,134 @@
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * All rights reserved.
+ * Portions of this software were developed by David Chisnall
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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. 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "from @(#)strtoul.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: head/lib/libc/stdlib/strtoumax.c 251672 2013-06-13 00:19:30Z emaste $");
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <stdint.h>
+#include <reent.h>
+#include "../locale/setlocale.h"
+
+/*
+ * Convert a string to a uintmax_t integer.
+ *
+ * Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+uintmax_t
+_strtoumax_r(struct _reent *rptr, const char * __restrict nptr, 
+	     char ** __restrict endptr, int base, locale_t loc)
+{
+	const char *s = (const unsigned char *)nptr;
+	uintmax_t acc;
+	char c;
+	uintmax_t cutoff;
+	int neg = 0, any, cutlim;
+	
+	/*
+	 * See strtoimax for comments as to the logic used.
+	 */
+	do {
+		c = *s++;
+	} while (isspace_l(c, loc));
+	if (c == '-') {
+		neg = 1;
+		c = *s++;
+	} else {
+		neg = 0;
+		if (c == '+')
+			c = *s++;
+	}
+	if ((base == 0 || base == 16) &&
+	    c == '0' && (*s == 'x' || *s == 'X')) {
+		c = s[1];
+		s += 2;
+		base = 16;
+	}
+	if (base == 0)
+		base = c == '0' ? 8 : 10;
+	acc = any = 0;
+	if (base < 2 || base > 36)
+		goto noconv;
+
+	cutoff = UINTMAX_MAX / base;
+	cutlim = UINTMAX_MAX % base;
+	for ( ; ; c = *s++) {
+		if (c >= '0' && c <= '9')
+			c -= '0';
+		else if (c >= 'A' && c <= 'Z')
+			c -= 'A' - 10;
+		else if (c >= 'a' && c <= 'z')
+			c -= 'a' - 10;
+		else
+			break;
+		if (c >= base)
+			break;
+		if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+			any = -1;
+		else {
+			any = 1;
+			acc *= base;
+			acc += c;
+		}
+	}
+	if (any < 0) {
+		acc = UINTMAX_MAX;
+		rptr->_errno = ERANGE;
+	} else if (!any) {
+noconv:
+		rptr->_errno = EINVAL;
+	} else if (neg)
+		acc = -acc;
+	if (endptr != NULL)
+		*endptr = (char *)(any ? s - 1 : nptr);
+	return (acc);
+}
+uintmax_t
+strtoumax_l(const char * __restrict nptr, char ** __restrict endptr, int base,
+	    locale_t loc)
+{
+	return _strtoumax_r(_REENT, nptr, endptr, base, loc);
+}
+uintmax_t
+strtoumax(const char* __restrict nptr, char** __restrict endptr, int base)
+{
+	return _strtoumax_r(_REENT, nptr, endptr, base, __get_current_locale());
+}
-- 
2.11.0

From c9e3a15a3d739025fa2ed81d627f4c3fa9348504 Mon Sep 17 00:00:00 2001
From: Aditya Upadhyay <aadit0402@gmail.com>
Date: Thu, 20 Jul 2017 13:38:20 +0530
Subject: [PATCH 5/6] Importing wcstoimax inttypes method from FreeBSD.

---
 newlib/libc/stdlib/Makefile.am |   1 +
 newlib/libc/stdlib/wcstoimax.c | 141 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 142 insertions(+)
 create mode 100644 newlib/libc/stdlib/wcstoimax.c

diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am
index 7e6784758..47c4e1bf8 100644
--- a/newlib/libc/stdlib/Makefile.am
+++ b/newlib/libc/stdlib/Makefile.am
@@ -66,6 +66,7 @@ GENERAL_SOURCES = \
 	strtoumax.c	\
 	utoa.c          \
 	wcstod.c	\
+	wcstoimax.c	\
 	wcstol.c	\
 	wcstoul.c	\
 	wcstombs.c	\
diff --git a/newlib/libc/stdlib/wcstoimax.c b/newlib/libc/stdlib/wcstoimax.c
new file mode 100644
index 000000000..af4398832
--- /dev/null
+++ b/newlib/libc/stdlib/wcstoimax.c
@@ -0,0 +1,141 @@
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * All rights reserved.
+ * Portions of this software were developed by David Chisnall
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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. 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 0
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "from @(#)strtol.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+__FBSDID("FreeBSD: src/lib/libc/stdlib/strtoimax.c,v 1.8 2002/09/06 11:23:59 tjr Exp ");
+#endif
+__FBSDID("$FreeBSD: head/lib/libc/locale/wcstoimax.c 314436 2017-02-28 23:42:47Z imp $");
+
+#include <errno.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <reent.h>
+#include <stdint.h>
+#include "../locale/setlocale.h"
+
+/*
+ * Convert a wide character string to an intmax_t integer.
+ */
+intmax_t
+_wcstoimax_r(struct _reent *rptr, const wchar_t * __restrict nptr, 
+	     wchar_t ** __restrict endptr, int base, locale_t loc)
+{
+	const wchar_t *s = nptr;
+	uintmax_t acc;
+	wchar_t c;
+	uintmax_t cutoff;
+	int neg = 0, any, cutlim;
+	
+	/*
+	 * See strtoimax for comments as to the logic used.
+	 */
+	do {
+		c = *s++;
+	} while (iswspace_l(c, loc));
+	if (c == L'-') {
+		neg = 1;
+		c = *s++;
+	} else {
+		neg = 0;
+		if (c == L'+')
+			c = *s++;
+	}
+	if ((base == 0 || base == 16) &&
+	    c == L'0' && (*s == L'x' || *s == L'X')) {
+		c = s[1];
+		s += 2;
+		base = 16;
+	}
+	if (base == 0)
+		base = c == L'0' ? 8 : 10;
+	acc = any = 0;
+	if (base < 2 || base > 36)
+		goto noconv;
+
+	cutoff = neg ? -(uintmax_t)INTMAX_MIN : INTMAX_MAX;
+	cutlim = cutoff % base;
+	cutoff /= base;
+	for ( ; ; c = *s++) {
+#ifdef notyet
+		if (iswdigit_l(c, loc))
+			c = digittoint_l(c, loc);
+		else
+#endif
+		if (c >= L'0' && c <= L'9')
+			c -= L'0';
+		else if (c >= L'A' && c <= L'Z')
+			c -= L'A' - 10;
+		else if (c >= 'a' && c <= 'z')
+			c -= L'a' - 10;
+		else
+			break;
+		if (c >= base)
+			break;
+		if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+			any = -1;
+		else {
+			any = 1;
+			acc *= base;
+			acc += c;
+		}
+	}
+	if (any < 0) {
+		acc = neg ? INTMAX_MIN : INTMAX_MAX;
+		rptr->_errno = ERANGE;
+	} else if (!any) {
+noconv:
+		rptr->_errno = EINVAL;
+	} else if (neg)
+		acc = -acc;
+	if (endptr != NULL)
+		*endptr = (wchar_t *)(any ? s - 1 : nptr);
+	return (acc);
+}
+intmax_t
+wcstoimax_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
+    	    int base, locale_t loc)
+{
+	return _wcstoimax_r(_REENT, nptr, endptr, base, loc);
+}
+intmax_t
+wcstoimax(const wchar_t* __restrict nptr, wchar_t** __restrict endptr, int base)
+{
+	return _wcstoimax_r(_REENT, nptr, endptr, base, __get_current_locale());
+}
-- 
2.11.0

From e38393c5f7903ec9ba47f9b752ad8cf5220ac977 Mon Sep 17 00:00:00 2001
From: Aditya Upadhyay <aadit0402@gmail.com>
Date: Thu, 20 Jul 2017 13:39:22 +0530
Subject: [PATCH 6/6] Importing wcstoumax inttypes method from FreeBSD.

---
 newlib/libc/stdlib/Makefile.am |   1 +
 newlib/libc/stdlib/wcstoumax.c | 140 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 141 insertions(+)
 create mode 100644 newlib/libc/stdlib/wcstoumax.c

diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am
index 47c4e1bf8..8f4adac6c 100644
--- a/newlib/libc/stdlib/Makefile.am
+++ b/newlib/libc/stdlib/Makefile.am
@@ -73,6 +73,7 @@ GENERAL_SOURCES = \
 	wcstombs_r.c	\
 	wctomb.c	\
 	wctomb_r.c	\
+	wcstoumax.c
 	
 if HAVE_LONG_DOUBLE
 GENERAL_SOURCES += \
diff --git a/newlib/libc/stdlib/wcstoumax.c b/newlib/libc/stdlib/wcstoumax.c
new file mode 100644
index 000000000..0ffde70c1
--- /dev/null
+++ b/newlib/libc/stdlib/wcstoumax.c
@@ -0,0 +1,140 @@
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * All rights reserved.
+ * Portions of this software were developed by David Chisnall
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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. 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 0
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "from @(#)strtoul.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+__FBSDID("FreeBSD: src/lib/libc/stdlib/strtoumax.c,v 1.8 2002/09/06 11:23:59 tjr Exp ");
+#endif
+__FBSDID("$FreeBSD: head/lib/libc/locale/wcstoumax.c 314436 2017-02-28 23:42:47Z imp $");
+
+#include <errno.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <stdint.h>
+#include <reent.h>
+#include "../locale/setlocale.h"
+
+/*
+ * Convert a wide character string to a uintmax_t integer.
+ */
+uintmax_t
+_wcstoumax_r(struct _reent *rptr,const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
+    int base, locale_t loc)
+{
+	const wchar_t *s = nptr;
+	uintmax_t acc;
+	wchar_t c;
+	uintmax_t cutoff;
+	int neg = 0, any, cutlim;
+	
+	/*
+	 * See strtoimax for comments as to the logic used.
+	 */
+	do {
+		c = *s++;
+	} while (iswspace_l(c, loc));
+	if (c == L'-') {
+		neg = 1;
+		c = *s++;
+	} else {
+		neg = 0;
+		if (c == L'+')
+			c = *s++;
+	}
+	if ((base == 0 || base == 16) &&
+	    c == L'0' && (*s == L'x' || *s == L'X')) {
+		c = s[1];
+		s += 2;
+		base = 16;
+	}
+	if (base == 0)
+		base = c == L'0' ? 8 : 10;
+	acc = any = 0;
+	if (base < 2 || base > 36)
+		goto noconv;
+
+	cutoff = UINTMAX_MAX / base;
+	cutlim = UINTMAX_MAX % base;
+	for ( ; ; c = *s++) {
+#ifdef notyet
+		if (iswdigit_l(c, loc))
+			c = digittoint_l(c, loc);
+		else
+#endif
+		if (c >= L'0' && c <= L'9')
+			c -= L'0';
+		else if (c >= L'A' && c <= L'Z')
+			c -= L'A' - 10;
+		else if (c >= L'a' && c <= L'z')
+			c -= L'a' - 10;
+		else
+			break;
+		if (c >= base)
+			break;
+		if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
+			any = -1;
+		else {
+			any = 1;
+			acc *= base;
+			acc += c;
+		}
+	}
+	if (any < 0) {
+		acc = UINTMAX_MAX;
+		rptr->_errno = ERANGE;
+	} else if (!any) {
+noconv:
+		rptr->_errno = EINVAL;
+	} else if (neg)
+		acc = -acc;
+	if (endptr != NULL)
+		*endptr = (wchar_t *)(any ? s - 1 : nptr);
+	return (acc);
+}
+uintmax_t
+wcstoumax_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr,
+    	    int base, locale_t loc)
+{
+	return _wcstoumax_r(_REENT, nptr, endptr, base, loc);
+}
+uintmax_t
+wcstoumax(const wchar_t* __restrict nptr, wchar_t** __restrict endptr, int base)
+{
+	return _wcstoumax_r(_REENT, nptr, endptr, base, __get_current_locale());
+}
-- 
2.11.0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]