From f6841680502d06f4d1e375144998955f245dfc23 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 11 Feb 2025 23:47:00 +0100 Subject: [PATCH] efi: add strcspn16()/strspn16() to efi libs too --- src/boot/efi-string.c | 24 +++++++++++++++++++++++ src/boot/efi-string.h | 3 +++ src/boot/test-efi-string.c | 23 ++++++++++++++++++++++ src/fundamental/string-util-fundamental.h | 2 ++ 4 files changed, 52 insertions(+) diff --git a/src/boot/efi-string.c b/src/boot/efi-string.c index 488798b393..1f669a2749 100644 --- a/src/boot/efi-string.c +++ b/src/boot/efi-string.c @@ -1109,3 +1109,27 @@ void *memset(void *p, int c, size_t n) { return p; } + +size_t strspn16(const char16_t *p, const char16_t *good) { + assert(p); + assert(good); + + const char16_t *i = p; + for (; *i != 0; i++) + if (!strchr16(good, *i)) + break; + + return i - p; +} + +size_t strcspn16(const char16_t *p, const char16_t *bad) { + assert(p); + assert(bad); + + const char16_t *i = p; + for (; *i != 0; i++) + if (strchr16(bad, *i)) + break; + + return i - p; +} diff --git a/src/boot/efi-string.h b/src/boot/efi-string.h index 5c6326b495..fa1f63324a 100644 --- a/src/boot/efi-string.h +++ b/src/boot/efi-string.h @@ -108,6 +108,9 @@ static inline char *xstr16_to_ascii(const char16_t *str16) { char* startswith8(const char *s, const char *prefix); +size_t strspn16(const char16_t *p, const char16_t *good); +size_t strcspn16(const char16_t *p, const char16_t *bad); + bool efi_fnmatch(const char16_t *pattern, const char16_t *haystack); bool parse_number8(const char *s, uint64_t *ret_u, const char **ret_tail); diff --git a/src/boot/test-efi-string.c b/src/boot/test-efi-string.c index 98c92690a7..3278ac2c30 100644 --- a/src/boot/test-efi-string.c +++ b/src/boot/test-efi-string.c @@ -831,4 +831,27 @@ TEST(efi_memset) { assert_se(memcmp(buf, "aaaaaaaaaa", 10) == 0); } +TEST(efi_strspn) { + ASSERT_EQ(strspn16(u"foobar", u"fo"), 3U); + ASSERT_EQ(strspn16(u"foobar", u"ob"), 0U); + ASSERT_EQ(strspn16(u"foobar", u"fxayzy"), 1U); + ASSERT_EQ(strspn16(u"", u"abcdefef"), 0U); + ASSERT_EQ(strspn16(u"", u""), 0U); + ASSERT_EQ(strspn16(u"foobar", u""), 0U); + ASSERT_EQ(strspn16(u"foffffffffffoobar", u"fofo"), 14U); +} + +TEST(efi_strcspn) { + ASSERT_EQ(strcspn16(u"foobar", u"fo"), 0U); + ASSERT_EQ(strcspn16(u"foobar", u"bar"), 3U); + ASSERT_EQ(strcspn16(u"foobar", u"xhyfzy"), 0U); + ASSERT_EQ(strcspn16(u"foobar", u"xhyozy"), 1U); + ASSERT_EQ(strcspn16(u"foobar", u"xhyzy"), 6U); + ASSERT_EQ(strcspn16(u"", u"abcdefef"), 0U); + ASSERT_EQ(strcspn16(u"", u""), 0U); + ASSERT_EQ(strcspn16(u"foobar", u""), 6U); + ASSERT_EQ(strcspn16(u"foffffffffffoobar", u"fofo"), 0U); + ASSERT_EQ(strcspn16(u"foffffffffffoobar", u"a"), 15U); +} + DEFINE_TEST_MAIN(LOG_INFO); diff --git a/src/fundamental/string-util-fundamental.h b/src/fundamental/string-util-fundamental.h index 419f1cc3da..ec3ad48706 100644 --- a/src/fundamental/string-util-fundamental.h +++ b/src/fundamental/string-util-fundamental.h @@ -16,6 +16,8 @@ # define strncmp strncmp16 # define strcasecmp strcasecmp16 # define strncasecmp strncasecmp16 +# define strspn strspn16 +# define strcspn strcspn16 # define STR_C(str) (L ## str) typedef char16_t sd_char; #else