diff options
-rw-r--r-- | payloads/libpayload/include/string.h | 1 | ||||
-rw-r--r-- | payloads/libpayload/libc/Makefile.mk | 1 | ||||
-rw-r--r-- | src/commonlib/Makefile.mk | 4 | ||||
-rw-r--r-- | src/commonlib/bsd/include/commonlib/bsd/string.h | 10 | ||||
-rw-r--r-- | src/commonlib/bsd/string.c | 15 | ||||
-rw-r--r-- | src/include/string.h | 8 | ||||
-rw-r--r-- | src/lib/string.c | 9 | ||||
-rw-r--r-- | tests/commonlib/bsd/Makefile.mk | 4 | ||||
-rw-r--r-- | tests/commonlib/bsd/string-test.c | 38 | ||||
-rw-r--r-- | tests/lib/string-test.c | 26 |
10 files changed, 74 insertions, 42 deletions
diff --git a/payloads/libpayload/include/string.h b/payloads/libpayload/include/string.h index e87dea5def..f4ce41fce7 100644 --- a/payloads/libpayload/include/string.h +++ b/payloads/libpayload/include/string.h @@ -29,6 +29,7 @@ #ifndef _STRING_H #define _STRING_H +#include <commonlib/bsd/string.h> #include <stddef.h> /** diff --git a/payloads/libpayload/libc/Makefile.mk b/payloads/libpayload/libc/Makefile.mk index c9fc17a7b5..5a65565e55 100644 --- a/payloads/libpayload/libc/Makefile.mk +++ b/payloads/libpayload/libc/Makefile.mk @@ -47,6 +47,7 @@ ifeq ($(CONFIG_LP_LIBC),y) libc-srcs += $(coreboottop)/src/commonlib/bsd/elog.c libc-srcs += $(coreboottop)/src/commonlib/bsd/gcd.c libc-srcs += $(coreboottop)/src/commonlib/bsd/ipchksum.c +libc-srcs += $(coreboottop)/src/commonlib/bsd/string.c ifeq ($(CONFIG_LP_GPL),y) libc-srcs += $(coreboottop)/src/commonlib/list.c endif diff --git a/src/commonlib/Makefile.mk b/src/commonlib/Makefile.mk index 30aaddf2cc..00f3629c1e 100644 --- a/src/commonlib/Makefile.mk +++ b/src/commonlib/Makefile.mk @@ -65,3 +65,7 @@ decompressor-y += bsd/gcd.c all-y += bsd/gcd.c all-y += bsd/ipchksum.c + +decompressor-y += bsd/string.c +smm-y += bsd/string.c +all-y += bsd/string.c diff --git a/src/commonlib/bsd/include/commonlib/bsd/string.h b/src/commonlib/bsd/include/commonlib/bsd/string.h new file mode 100644 index 0000000000..bbd4754800 --- /dev/null +++ b/src/commonlib/bsd/include/commonlib/bsd/string.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +#ifndef _COMMONLIB_BSD_STRING_H_ +#define _COMMONLIB_BSD_STRING_H_ + +#include <stdint.h> + +unsigned int skip_atoi(char **ptr); + +#endif /* _COMMONLIB_BSD_STRING_H_ */ diff --git a/src/commonlib/bsd/string.c b/src/commonlib/bsd/string.c new file mode 100644 index 0000000000..3286d41b1c --- /dev/null +++ b/src/commonlib/bsd/string.c @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +#include <commonlib/bsd/string.h> +#include <ctype.h> + +unsigned int skip_atoi(char **ptr) +{ + unsigned int result = 0; + char *str; + + for (str = *ptr; isdigit(str[0]); str++) + result = result * 10 + (str[0] - '0'); + *ptr = str; + return result; +} diff --git a/src/include/string.h b/src/include/string.h index 33f0dfe196..e752f8f531 100644 --- a/src/include/string.h +++ b/src/include/string.h @@ -3,6 +3,7 @@ #ifndef STRING_H #define STRING_H +#include <commonlib/bsd/string.h> #include <stddef.h> void *memcpy(void *dest, const void *src, size_t n); @@ -36,11 +37,4 @@ long atol(const char *str); */ char *strrchr(const char *s, int c); -/* - * Parses an unsigned integer and moves the input pointer forward to the first - * character that's not a valid digit. s and *s must not be NULL. Result - * undefined if it overruns the return type size. - */ -unsigned int skip_atoi(char **s); - #endif /* STRING_H */ diff --git a/src/lib/string.c b/src/lib/string.c index dd7d1512ea..d23ed1f7e5 100644 --- a/src/lib/string.c +++ b/src/lib/string.c @@ -125,15 +125,6 @@ int strncmp(const char *s1, const char *s2, int maxlen) return 0; } -unsigned int skip_atoi(char **s) -{ - unsigned int i = 0; - - while (isdigit(**s)) - i = i*10 + *((*s)++) - '0'; - return i; -} - int strspn(const char *str, const char *spn) { int ret = 0; diff --git a/tests/commonlib/bsd/Makefile.mk b/tests/commonlib/bsd/Makefile.mk index 3de223e707..ee710bcdb9 100644 --- a/tests/commonlib/bsd/Makefile.mk +++ b/tests/commonlib/bsd/Makefile.mk @@ -3,6 +3,7 @@ tests-y += helpers-test tests-y += gcd-test tests-y += ipchksum-test +tests-y += string-test helpers-test-srcs += tests/commonlib/bsd/helpers-test.c @@ -11,3 +12,6 @@ gcd-test-srcs += src/commonlib/bsd/gcd.c ipchksum-test-srcs += tests/commonlib/bsd/ipchksum-test.c ipchksum-test-srcs += src/commonlib/bsd/ipchksum.c + +string-test-srcs += tests/commonlib/bsd/string-test.c +string-test-srcs += src/commonlib/bsd/string.c diff --git a/tests/commonlib/bsd/string-test.c b/tests/commonlib/bsd/string-test.c new file mode 100644 index 0000000000..d94b82e18c --- /dev/null +++ b/tests/commonlib/bsd/string-test.c @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <commonlib/bsd/string.h> +#include <tests/test.h> + +/* Used to test skip_atoi */ +struct str_with_u_val_t { + char *str; + uint32_t value; + uint32_t offset; +} str_with_u_val[] = { + {"42aa", 42, 2}, + {"a", 0, 0}, + {"0", 0, 1}, + {"4a2", 4, 1}, +}; + +static void test_skip_atoi(void **state) +{ + int i; + char *ptr, *copy; + + for (i = 0; i < ARRAY_SIZE(str_with_u_val); i++) { + ptr = str_with_u_val[i].str; + copy = ptr; + assert_true(str_with_u_val[i].value == skip_atoi(&ptr)); + assert_int_equal(str_with_u_val[i].offset, ptr - copy); + } +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_skip_atoi), + }; + + return cb_run_group_tests(tests, NULL, NULL); +} diff --git a/tests/lib/string-test.c b/tests/lib/string-test.c index 621a74ceff..17bb69ab56 100644 --- a/tests/lib/string-test.c +++ b/tests/lib/string-test.c @@ -43,18 +43,6 @@ struct str_with_l_val_t { {"\t\n\r\f\v-42", -42}, }; -/* Used to test skip_atoi */ -struct str_with_u_val_t { - char *str; - uint32_t value; - uint32_t offset; -} str_with_u_val[] = { - {"42aa", 42, 2}, - {"a", 0, 0}, - {"0", 0, 1}, - {"4a2", 4, 1}, -}; - static void test_strdup(void **state) { char str[] = "Hello coreboot\n"; @@ -204,19 +192,6 @@ static void test_strncmp(void **state) assert_int_equal(0, strncmp(str, str2, str2_len - 1)); } -static void test_skip_atoi(void **state) -{ - int i; - char *ptr, *copy; - - for (i = 0; i < ARRAY_SIZE(str_with_u_val); i++) { - ptr = str_with_u_val[i].str; - copy = ptr; - assert_true(str_with_u_val[i].value == skip_atoi(&ptr)); - assert_int_equal(str_with_u_val[i].offset, ptr - copy); - } -} - static void test_strspn(void **state) { char str[] = "4213401234"; @@ -260,7 +235,6 @@ int main(void) cmocka_unit_test(test_strcpy), cmocka_unit_test(test_strcmp), cmocka_unit_test(test_strncmp), - cmocka_unit_test(test_skip_atoi), cmocka_unit_test(test_strspn), cmocka_unit_test(test_strcspn), cmocka_unit_test(test_atol), |