From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932597AbbEHSfZ (ORCPT ); Fri, 8 May 2015 14:35:25 -0400 Received: from mail-wg0-f54.google.com ([74.125.82.54]:33563 "EHLO mail-wg0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932312AbbEHSfX (ORCPT ); Fri, 8 May 2015 14:35:23 -0400 Date: Fri, 8 May 2015 21:35:19 +0300 From: Alexey Dobriyan To: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, linux@rasmusvillemoes.dk Subject: [PATCH 07/12] parse_integer: convert lib/ Message-ID: <20150508183519.GE9182@p183.telecom.by> References: <20150508182911.GA9044@p183.telecom.by> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150508182911.GA9044@p183.telecom.by> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Convert away lib/ from deprecated simple_strto*() interfaces. Signed-off-by: Alexey Dobriyan --- lib/cmdline.c | 44 ++++++++++++++++++++++++-------------------- lib/parser.c | 33 ++++++++++++++++----------------- lib/swiotlb.c | 2 +- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/lib/cmdline.c b/lib/cmdline.c index 8f13cf7..c248c58 100644 --- a/lib/cmdline.c +++ b/lib/cmdline.c @@ -27,7 +27,7 @@ static int get_range(char **str, int *pint) int x, inc_counter, upper_range; (*str)++; - upper_range = simple_strtol((*str), NULL, 0); + parse_integer(*str, 0, &upper_range); inc_counter = upper_range - *pint; for (x = *pint; x < upper_range; x++) *pint++ = x; @@ -51,13 +51,14 @@ static int get_range(char **str, int *pint) int get_option(char **str, int *pint) { - char *cur = *str; + int len; - if (!cur || !(*cur)) + if (!str || !*str) return 0; - *pint = simple_strtol(cur, str, 0); - if (cur == *str) + len = parse_integer(*str, 0, pint); + if (len < 0) return 0; + *str += len; if (**str == ',') { (*str)++; return 2; @@ -126,38 +127,41 @@ EXPORT_SYMBOL(get_options); unsigned long long memparse(const char *ptr, char **retptr) { - char *endptr; /* local pointer to end of parsed string */ - - unsigned long long ret = simple_strtoull(ptr, &endptr, 0); - - switch (*endptr) { + unsigned long long val = 0; + int len; + + len = parse_integer(ptr, 0, &val); + if (len < 0) + goto out; + ptr += len; + switch (*ptr) { case 'E': case 'e': - ret <<= 10; + val <<= 10; case 'P': case 'p': - ret <<= 10; + val <<= 10; case 'T': case 't': - ret <<= 10; + val <<= 10; case 'G': case 'g': - ret <<= 10; + val <<= 10; case 'M': case 'm': - ret <<= 10; + val <<= 10; case 'K': case 'k': - ret <<= 10; - endptr++; + val <<= 10; + ptr++; default: break; } - +out: if (retptr) - *retptr = endptr; + *retptr = (char *)ptr; - return ret; + return val; } EXPORT_SYMBOL(memparse); diff --git a/lib/parser.c b/lib/parser.c index b6d1163..f003867 100644 --- a/lib/parser.c +++ b/lib/parser.c @@ -44,7 +44,7 @@ static int match_one(char *s, const char *p, substring_t args[]) p = meta + 1; if (isdigit(*p)) - len = simple_strtoul(p, (char **) &p, 10); + p += parse_integer(p, 10, (unsigned int *)&len); else if (*p == '%') { if (*s++ != '%') return 0; @@ -57,6 +57,11 @@ static int match_one(char *s, const char *p, substring_t args[]) args[argc].from = s; switch (*p++) { + union { + int i; + unsigned int u; + } u; + case 's': { size_t str_len = strlen(s); @@ -68,19 +73,20 @@ static int match_one(char *s, const char *p, substring_t args[]) break; } case 'd': - simple_strtol(s, &args[argc].to, 0); + len = parse_integer(s, 0, &u.i); goto num; case 'u': - simple_strtoul(s, &args[argc].to, 0); + len = parse_integer(s, 0, &u.u); goto num; case 'o': - simple_strtoul(s, &args[argc].to, 8); + len = parse_integer(s, 8, &u.u); goto num; case 'x': - simple_strtoul(s, &args[argc].to, 16); + len = parse_integer(s, 16, &u.u); num: - if (args[argc].to == args[argc].from) + if (len < 0) return 0; + args[argc].to = args[argc].from + len; break; default: return 0; @@ -127,10 +133,8 @@ EXPORT_SYMBOL(match_token); */ static int match_number(substring_t *s, int *result, int base) { - char *endp; char *buf; int ret; - long val; size_t len = s->to - s->from; buf = kmalloc(len + 1, GFP_KERNEL); @@ -139,16 +143,11 @@ static int match_number(substring_t *s, int *result, int base) memcpy(buf, s->from, len); buf[len] = '\0'; - ret = 0; - val = simple_strtol(buf, &endp, base); - if (endp == buf) - ret = -EINVAL; - else if (val < (long)INT_MIN || val > (long)INT_MAX) - ret = -ERANGE; - else - *result = (int) val; + ret = parse_integer(buf, base, result); kfree(buf); - return ret; + if (ret < 0) + return ret; + return 0; } /** diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 4abda07..33178e5 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -100,7 +100,7 @@ static int __init setup_io_tlb_npages(char *str) { if (isdigit(*str)) { - io_tlb_nslabs = simple_strtoul(str, &str, 0); + str += parse_integer(str, 0, &io_tlb_nslabs); /* avoid tail segment of size < IO_TLB_SEGSIZE */ io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE); } -- 2.0.4