diff options
author | Mary Ruthven <mruthven@chromium.org> | 2021-11-09 14:22:42 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-11-18 04:48:04 +0000 |
commit | 16989bbb49e821adb4d3626f021210c9d7a16ba4 (patch) | |
tree | d3408d1aa4639a0168b8c412c95b417e103ee2dd | |
parent | 35083b5b9d2e7329da3546ea115a985e38ecd31b (diff) | |
download | chrome-ec-16989bbb49e821adb4d3626f021210c9d7a16ba4.tar.gz |
Revert "Align behavior of strtoi() and strtoul() to match Linux manpage description of strtol()."
This reverts commit ac8a13329b0b321daeb87f6afb79c163beb21372.
BUG=b:200823466
TEST=make buildall -j
Change-Id: I379e5fc1ebd15030715561732ea71eb6fda8406d
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3273383
Reviewed-by: Vadim Sukhomlinov <sukhomlinov@chromium.org>
-rw-r--r-- | common/util.c | 59 | ||||
-rw-r--r-- | test/utils_str.c | 97 |
2 files changed, 28 insertions, 128 deletions
diff --git a/common/util.c b/common/util.c index 1087cc371a..2b667d16ab 100644 --- a/common/util.c +++ b/common/util.c @@ -309,18 +309,6 @@ __stdlib_compat int atoi(const char *nptr) return neg ? -result : result; } -static int find_base(int base, int *c, const char **nptr) { - if ((base == 0 || base == 16) && *c == '0' - && (**nptr == 'x' || **nptr == 'X')) { - *c = (*nptr)[1]; - (*nptr) += 2; - base = 16; - } else if (base == 0) { - base = *c == '0' ? 8 : 10; - } - return base; -} - /* Like strtol(), but for integers */ __stdlib_compat int strtoi(const char *nptr, char **endptr, int base) @@ -329,18 +317,24 @@ __stdlib_compat int strtoi(const char *nptr, char **endptr, int base) int neg = 0; int c = '\0'; + if (endptr) + *endptr = (char *)nptr; + while ((c = *nptr++) && isspace(c)) ; - if (c == '+') { - c = *nptr++; - } else if (c == '-') { - neg = 1; - c = *nptr++; + if (c == '0' && *nptr == 'x') { + base = 16; + c = nptr[1]; + nptr += 2; + } else if (base == 0) { + base = 10; + if (c == '-') { + neg = 1; + c = *nptr++; + } } - base = find_base(base, &c, &nptr); - while (c) { if (c >= '0' && c < '0' + MIN(base, 10)) result = result * base + (c - '0'); @@ -351,11 +345,11 @@ __stdlib_compat int strtoi(const char *nptr, char **endptr, int base) else break; + if (endptr) + *endptr = (char *)nptr; c = *nptr++; } - if (endptr) - *endptr = (char *)nptr - 1; return neg ? -result : result; } @@ -364,18 +358,21 @@ __stdlib_compat uint64_t strtoul(const char *nptr, char **endptr, int base) uint64_t result = 0; int c = '\0'; + if (endptr) + *endptr = (char *)nptr; + while ((c = *nptr++) && isspace(c)) ; - if (c == '+') { - c = *nptr++; - } else if (c == '-') { - if (endptr) - *endptr = (char *)nptr - 1; - return result; + if (c == '0' && *nptr == 'x') { + base = 16; + c = nptr[1]; + nptr += 2; + } else if (base == 0) { + base = 10; + if (c == '-') + return result; } - - base = find_base(base, &c, &nptr); while (c) { if (c >= '0' && c < '0' + MIN(base, 10)) @@ -387,11 +384,11 @@ __stdlib_compat uint64_t strtoul(const char *nptr, char **endptr, int base) else break; + if (endptr) + *endptr = (char *)nptr; c = *nptr++; } - if (endptr) - *endptr = (char *)nptr - 1; return result; } diff --git a/test/utils_str.c b/test/utils_str.c index 6498ef85d5..81c600bc03 100644 --- a/test/utils_str.c +++ b/test/utils_str.c @@ -33,112 +33,16 @@ static int test_strtoi(void) TEST_ASSERT(strtoi("10", &e, 0) == 10); TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("010", &e, 0) == 8); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("+010", &e, 0) == 8); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("-010", &e, 0) == -8); - TEST_ASSERT(e && (*e == '\0')); TEST_ASSERT(strtoi("0x1f z", &e, 0) == 31); TEST_ASSERT(e && (*e == ' ')); - TEST_ASSERT(strtoi("0X1f z", &e, 0) == 31); - TEST_ASSERT(e && (*e == ' ')); TEST_ASSERT(strtoi("10a", &e, 16) == 266); TEST_ASSERT(e && (*e == '\0')); TEST_ASSERT(strtoi("0x02C", &e, 16) == 44); TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("+0x02C", &e, 16) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("-0x02C", &e, 16) == -44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("0x02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("+0x02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("-0x02C", &e, 0) == -44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("0X02C", &e, 16) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("+0X02C", &e, 16) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("-0X02C", &e, 16) == -44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("0X02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("+0X02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoi("-0X02C", &e, 0) == -44); - TEST_ASSERT(e && (*e == '\0')); TEST_ASSERT(strtoi(" -12", &e, 0) == -12); TEST_ASSERT(e && (*e == '\0')); TEST_ASSERT(strtoi("!", &e, 0) == 0); TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoi("+!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoi("+0!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoi("+0x!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoi("+0X!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - - return EC_SUCCESS; -} - -static int test_strtoul(void) -{ - char *e; - - TEST_ASSERT(strtoul("10", &e, 0) == 10); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("010", &e, 0) == 8); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("+010", &e, 0) == 8); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("-010", &e, 0) == 0); - TEST_ASSERT(e && (*e == '-')); - TEST_ASSERT(strtoul("0x1f z", &e, 0) == 31); - TEST_ASSERT(e && (*e == ' ')); - TEST_ASSERT(strtoul("0X1f z", &e, 0) == 31); - TEST_ASSERT(e && (*e == ' ')); - TEST_ASSERT(strtoul("10a", &e, 16) == 266); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("0x02C", &e, 16) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("+0x02C", &e, 16) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("-0x02C", &e, 16) == 0); - TEST_ASSERT(e && (*e == '-')); - TEST_ASSERT(strtoul("0x02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("+0x02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("-0x02C", &e, 0) == 0); - TEST_ASSERT(e && (*e == '-')); - TEST_ASSERT(strtoul("0X02C", &e, 16) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("+0X02C", &e, 16) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("-0X02C", &e, 16) == 0); - TEST_ASSERT(e && (*e == '-')); - TEST_ASSERT(strtoul("0X02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("+0X02C", &e, 0) == 44); - TEST_ASSERT(e && (*e == '\0')); - TEST_ASSERT(strtoul("-0X02C", &e, 0) == 0); - TEST_ASSERT(e && (*e == '-')); - TEST_ASSERT(strtoul(" -12", &e, 0) == 0); - TEST_ASSERT(e && (*e == '-')); - TEST_ASSERT(strtoul("!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoul("+!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoul("+0!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoul("+0x!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); - TEST_ASSERT(strtoul("+0X!", &e, 0) == 0); - TEST_ASSERT(e && (*e == '!')); return EC_SUCCESS; } @@ -253,7 +157,6 @@ void run_test(void) RUN_TEST(test_isalpha); RUN_TEST(test_isprint); RUN_TEST(test_strtoi); - RUN_TEST(test_strtoul); RUN_TEST(test_parse_bool); RUN_TEST(test_strzcpy); RUN_TEST(test_strncpy); |