From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933596AbbDIUCu (ORCPT ); Thu, 9 Apr 2015 16:02:50 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:50826 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933242AbbDIUCs (ORCPT ); Thu, 9 Apr 2015 16:02:48 -0400 Date: Thu, 9 Apr 2015 13:02:47 -0700 From: Andrew Morton To: Alexey Dobriyan Cc: linux-kernel@vger.kernel.org Subject: Re: [PATCH] Add parse_integer() (replacement for simple_strto*()) Message-Id: <20150409130247.18f3133c58b5ebc11f0f64d8@linux-foundation.org> In-Reply-To: <20150409152613.GA14850@p183.telecom.by> References: <20150409152613.GA14850@p183.telecom.by> X-Mailer: Sylpheed 3.4.1 (GTK+ 2.24.23; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 9 Apr 2015 18:26:14 +0300 Alexey Dobriyan wrote: > kstrto*() and kstrto*_from_user() family of functions were added > help with parsing one integer written as string to proc/sysfs/debugfs > files and pass it elsewhere. But they have a limitation: string passed > must end with \0 or \n\0. There are enough places where kstrto*() > functions can't be used because of this limitation. Trivial example: > parse "%u.%u". > > ... > > include/linux/kernel.h | 72 +++++++++++++++++++ > lib/Makefile | 1 > lib/kstrtox.c | 27 +------ > lib/parse-integer.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 257 insertions(+), 23 deletions(-) That's a lot of code for something which is almost the same as kstrtofoo(). Can we hack up _kstrtoull() to optionally provide the new behaviour? We could use the top bit of `base' to select the behaviour. Something like --- a/lib/kstrtox.c~a +++ a/lib/kstrtox.c @@ -87,19 +87,23 @@ static int _kstrtoull(const char *s, uns { unsigned long long _res; unsigned int rv; + const char *cursor; + const unsigned int __base = base & 0x7fffffff; - s = _parse_integer_fixup_radix(s, &base); - rv = _parse_integer(s, base, &_res); + cursor = _parse_integer_fixup_radix(s, &__base); + rv = _parse_integer(cursor, __base, &_res); if (rv & KSTRTOX_OVERFLOW) return -ERANGE; if (rv == 0) return -EINVAL; - s += rv; - if (*s == '\n') - s++; - if (*s) - return -EINVAL; + cursor += rv; *res = _res; + if (base & 0x80000000) + return cursor - s; + if (*cursor == '\n') + cursor++; + if (*cursor) + return -EINVAL; return 0; } then add a bunch of wrappers?