]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
efi: add strcspn16()/strspn16() to efi libs too
authorLennart Poettering <lennart@poettering.net>
Tue, 11 Feb 2025 22:47:00 +0000 (23:47 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 21 Feb 2025 09:04:15 +0000 (10:04 +0100)
src/boot/efi-string.c
src/boot/efi-string.h
src/boot/test-efi-string.c
src/fundamental/string-util-fundamental.h

index 488798b393120b1c6af41beceee64f770f17bd7e..1f669a2749c3644773d8a6c1fa909084cd8b8af9 100644 (file)
@@ -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;
+}
index 5c6326b495c7557174debf201bc26fbfcc56f6c6..fa1f63324aa1c8f4660ab6f42d802a49ea152557 100644 (file)
@@ -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);
index 98c92690a7f7087ca523882b91d90fa9d7cdcf3e..3278ac2c30df43209a4455c2d3243d0c86034e65 100644 (file)
@@ -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);
index 419f1cc3da43e9e9bd036fffb24d4133c9b73a9a..ec3ad48706a0e04cece397f49ef8718016292d99 100644 (file)
@@ -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