mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-17 22:49:02 +00:00
lib: Fix a few bugs in trailing_strtoln()
At present this has a minor bug in that it reads the byte before the start of the string, if it is empty. Also it doesn't handle a non-numeric prefix which is only one character long. Fix these bugs with a reworked implementation. Add a test for the second case. The first one is hard to test. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
4e64cae0a0
commit
d667a0d8f4
3 changed files with 11 additions and 5 deletions
|
@ -98,6 +98,9 @@ long long simple_strtoll(const char *cp, char **endp, unsigned int base);
|
|||
* Given a string this finds a trailing number on the string and returns it.
|
||||
* For example, "abc123" would return 123.
|
||||
*
|
||||
* Note that this does not handle a string without a prefix. See dectoul() for
|
||||
* that case.
|
||||
*
|
||||
* @str: String to examine
|
||||
* Return: trailing number if found, else -1
|
||||
*/
|
||||
|
|
11
lib/strto.c
11
lib/strto.c
|
@ -189,11 +189,12 @@ long trailing_strtoln(const char *str, const char *end)
|
|||
|
||||
if (!end)
|
||||
end = str + strlen(str);
|
||||
if (isdigit(end[-1])) {
|
||||
for (p = end - 1; p > str; p--) {
|
||||
if (!isdigit(*p))
|
||||
return dectoul(p + 1, NULL);
|
||||
}
|
||||
p = end - 1;
|
||||
if (p > str && isdigit(*p)) {
|
||||
do {
|
||||
if (!isdigit(p[-1]))
|
||||
return dectoul(p, NULL);
|
||||
} while (--p > str);
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
|
|
@ -257,6 +257,8 @@ static int str_trailing(struct unit_test_state *uts)
|
|||
ut_asserteq(123, trailing_strtoln(str1, str1 + 6));
|
||||
ut_asserteq(-1, trailing_strtoln(str1, str1 + 9));
|
||||
|
||||
ut_asserteq(3, trailing_strtol("a3"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
STR_TEST(str_trailing, 0);
|
||||
|
|
Loading…
Add table
Reference in a new issue