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>
diff --git a/include/vsprintf.h b/include/vsprintf.h
index d4bf321..5172cee 100644
--- a/include/vsprintf.h
+++ b/include/vsprintf.h
@@ -98,6 +98,9 @@
* 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
*/
diff --git a/lib/strto.c b/lib/strto.c
index f191884..b1d803a 100644
--- a/lib/strto.c
+++ b/lib/strto.c
@@ -189,11 +189,12 @@
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;
diff --git a/test/str_ut.c b/test/str_ut.c
index 9674a59..058b359 100644
--- a/test/str_ut.c
+++ b/test/str_ut.c
@@ -257,6 +257,8 @@
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);