From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 66861 invoked by alias); 24 Jul 2017 22:35:51 -0000 Mailing-List: contact newlib-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-owner@sourceware.org Received: (qmail 65746 invoked by uid 89); 24 Jul 2017 22:35:49 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-ua0-f170.google.com Received: from mail-ua0-f170.google.com (HELO mail-ua0-f170.google.com) (209.85.217.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Jul 2017 22:35:47 +0000 Received: by mail-ua0-f170.google.com with SMTP id w45so89928656uac.5 for ; Mon, 24 Jul 2017 15:35:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=eRogcw1iUgctzYglHC/wBUU3XPieGDLrP55P3tl/LM4=; b=fY5ccY4QybHbwFN27hrUL4FIghEvunQdmIft2VZT+YO060xw/2DqU/9BX2ncejeNOK 4fqL0ypF/+U9NRn/X4Aut1m6DroJq49N9JHc/RzHCecUJOsHo5j6GGRakrjosue7Sadc DTMSYvzl0H4VJZyYLgcXz+4Jzyuq+5/OlgkZhHPJP9FRcaufXvbzuQslX4dge+JqCyFo BF0I9GCiFMk1YlnkGRK/JvPrJZLOh2dQdA60scnisGfNBiexPBwdncO9lX84O/kDcHOR hJJW2Mv9BP7ecNmf5BSdPxtD5TMD7+R5Tj30GmxAYO6f++P7u4aHmoyTQcpxzvVBf3OV dkHg== X-Gm-Message-State: AIVw111BkCgxD8/cFdpd85JewL9OsJNhOWRb5lD2dCko7hOduvs4ZyE7 Ei/4FZA1lFxGUhA67URLk+hxDbnZlH9B X-Received: by 10.176.70.138 with SMTP id r10mr10983214uaa.53.1500935745356; Mon, 24 Jul 2017 15:35:45 -0700 (PDT) MIME-Version: 1.0 Received: by 10.159.59.29 with HTTP; Mon, 24 Jul 2017 15:35:44 -0700 (PDT) In-Reply-To: <20170724193503.17095-1-aadit0402@gmail.com> References: <20170724193503.17095-1-aadit0402@gmail.com> From: Gedare Bloom Date: Mon, 24 Jul 2017 22:35:00 -0000 Message-ID: Subject: Re: [PATCH 5/7] Importing strtoumax inttypes methods from FreeBSD. To: Aditya Upadhyay Cc: "newlib@sourceware.org" Content-Type: text/plain; charset="UTF-8" X-IsSubscribed: yes X-SW-Source: 2017/txt/msg00632.txt.bz2 On Mon, Jul 24, 2017 at 3:35 PM, Aditya Upadhyay wrote: > --- > newlib/libc/stdlib/Makefile.am | 1 + > newlib/libc/stdlib/strtoumax.c | 138 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 139 insertions(+) > create mode 100644 newlib/libc/stdlib/strtoumax.c > > diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am > index 6cca5f005..c51f51f7f 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..240a6afed > --- /dev/null > +++ b/newlib/libc/stdlib/strtoumax.c > @@ -0,0 +1,138 @@ > +/*- > + * 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 */ I doubt these 3 lines are needed. > +#include > +__FBSDID("$FreeBSD: head/lib/libc/stdlib/strtoumax.c 251672 2013-06-13 00:19:30Z emaste $"); > + > +#include > +#include > +#include > +#include > +#include > +#include > +#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. > + */ > + > +/* > + *Reentrant version of strtoumax. > + */ > +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.13.0 >