This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
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