At present this has a minor bug in that it reads the byte before the
start of the string. 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 <s...@chromium.org>
---

(no changes since v1)

 lib/strto.c   | 11 ++++++-----
 test/str_ut.c |  2 ++
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/lib/strto.c b/lib/strto.c
index 7bba1e3e549..58fc10ecaea 100644
--- a/lib/strto.c
+++ b/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;
diff --git a/test/str_ut.c b/test/str_ut.c
index 9674a59f2a6..058b3594379 100644
--- a/test/str_ut.c
+++ b/test/str_ut.c
@@ -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);
-- 
2.34.1.703.g22d0c6ccf7-goog

Reply via email to