From patchwork Fri Mar 20 07:49:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Simek X-Patchwork-Id: 243993 List-Id: U-Boot discussion From: michal.simek at xilinx.com (Michal Simek) Date: Fri, 20 Mar 2020 08:49:27 +0100 Subject: [PATCH v3] lib: Improve _parse_integer_fixup_radix base 16 detection Message-ID: Base autodetection is failing for this case: if test 257 -gt 3ae; then echo first; else echo second; fi It is because base for 3ae is recognized by _parse_integer_fixup_radix() as 10. The code detects the first char which is not between 'a'/'A' or 'f'/'F' to change base from dec to hex. Signed-off-by: Michal Simek Signed-off-by: Shiril Tichkule --- Changes in v3: - Fix commit message to be accurate based on code. - Use tolower instead of two ranges - Use do while loop - all reported by Andy - Remove Tom's reviewed-by tag because code has changed Changes in v2: - Fix end of string to be \0 instead of \n - Detect hex by checking chars between a-f to avoid cases like number follow by ; lib/strto.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/strto.c b/lib/strto.c index 55ff9f7437d5..1ac2b09c725c 100644 --- a/lib/strto.c +++ b/lib/strto.c @@ -22,9 +22,22 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base) *base = 16; else *base = 8; - } else + } else { + int i = 0; + char var; + *base = 10; + + do { + var = tolower(s[i++]); + if (var >= 'a' && var <= 'f') { + *base = 16; + break; + } + } while (var); + } } + if (*base == 16 && s[0] == '0' && tolower(s[1]) == 'x') s += 2; return s;