From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 44181 invoked by alias); 24 Jul 2017 22:37:34 -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 43134 invoked by uid 89); 24 Jul 2017 22:37:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.2 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-f195.google.com Received: from mail-ua0-f195.google.com (HELO mail-ua0-f195.google.com) (209.85.217.195) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Jul 2017 22:37:31 +0000 Received: by mail-ua0-f195.google.com with SMTP id w45so10869311uac.3 for ; Mon, 24 Jul 2017 15:37:31 -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=O+0e0jQ8xvCHOXE8uvM7eonpfSzBcQuxee1HKqQMmxc=; b=qAPPlOU4T5GnMMLibmW4Xe/SyZ3GaemTJsOqTaJEQb9F1CzAv6X9gBTk10VPX29XJU h7mcb/OrW4oV3JcZXVLH+vjkL2jjDu9n4BCJFy03BYRvTVKAF0BC+hd8Z0Z73ySR52ck PQEza/HEaB58OuXVCYqeSJOp4aGWFFsXZN2vA3AjYmqGdWRpvdjHEXYfYebRIhxO019V RLwEcO1T8oMDGETi+6iMyDw5XV2pLw/Z9YUkD5+rK6mhTk5C2UT98xb6Gt/Ql8MjKqd4 bvuWaphy+wg4R4OO3wSXHbALE46SeP8ZTzDJYNgwgSBvyzt5B1rMr31RZoLbqXqmLHkA CLsg== X-Gm-Message-State: AIVw113/VSoao5TU8Ct4dK+rfO8C53WDTy8NqFmCQQZtnFQ+ep2Lljub WL2Ve1hroqTWMg7vrfLwW3PALpj9pkFe X-Received: by 10.31.9.137 with SMTP id 131mr10061827vkj.142.1500935850071; Mon, 24 Jul 2017 15:37:30 -0700 (PDT) MIME-Version: 1.0 Received: by 10.159.59.29 with HTTP; Mon, 24 Jul 2017 15:37:29 -0700 (PDT) In-Reply-To: <20170724193524.17145-1-aadit0402@gmail.com> References: <20170724193524.17145-1-aadit0402@gmail.com> From: Gedare Bloom Date: Mon, 24 Jul 2017 22:37:00 -0000 Message-ID: Subject: Re: [PATCH 6/7] Importing wcstoimax 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/msg00633.txt.bz2 On Mon, Jul 24, 2017 at 3:35 PM, Aditya Upadhyay wrote: > --- > newlib/libc/stdlib/Makefile.am | 1 + > newlib/libc/stdlib/wcstoimax.c | 147 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 148 insertions(+) > create mode 100644 newlib/libc/stdlib/wcstoimax.c > > diff --git a/newlib/libc/stdlib/Makefile.am b/newlib/libc/stdlib/Makefile.am > index c51f51f7f..41aa8675a 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..4cd6efac4 > --- /dev/null > +++ b/newlib/libc/stdlib/wcstoimax.c > @@ -0,0 +1,147 @@ > +/*- > + * 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 > +#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 Delete the above lines instead of using #if 0 ... #endif. Also part of this appears to be from a different file. > +__FBSDID("$FreeBSD: head/lib/libc/locale/wcstoimax.c 314436 2017-02-28 23:42:47Z imp $"); > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include "../locale/setlocale.h" > + > +/* > + * Convert a wide character string to an intmax_t integer. > + */ > + > +/* > + *Reentrant version of wcstoimax. > + */ > +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.13.0 >