]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: add str_common_prefix() helper that determines length of common prefix...
authorLennart Poettering <lennart@poettering.net>
Wed, 5 Feb 2025 09:40:06 +0000 (10:40 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 17 Feb 2025 13:57:03 +0000 (14:57 +0100)
src/basic/string-util.c
src/basic/string-util.h
src/test/test-string-util.c

index 7f4be13b62af41beaa8fb2d0af85bc48daf9b7b4..4748d5e2b552c22f50ea3cd528b119560d141f73 100644 (file)
@@ -1470,3 +1470,19 @@ char* strrstr(const char *haystack, const char *needle) {
         }
         return NULL;
 }
+
+size_t str_common_prefix(const char *a, const char *b) {
+        assert(a);
+        assert(b);
+
+        /* Returns the length of the common prefix of the two specified strings, or SIZE_MAX in case the
+         * strings are fully identical. */
+
+        for (size_t n = 0;; n++) {
+                char c = a[n];
+                if (c != b[n])
+                        return n;
+                if (c == 0)
+                        return SIZE_MAX;
+        }
+}
index 85f206c689b9018ab30a773dfb6242572c08ee4e..d94e52c09dab2104769a5445bc0b14c6cb93c7b2 100644 (file)
@@ -308,3 +308,5 @@ bool version_is_valid_versionspec(const char *s);
 ssize_t strlevenshtein(const char *x, const char *y);
 
 char* strrstr(const char *haystack, const char *needle);
+
+size_t str_common_prefix(const char *a, const char *b);
index 1b447abda9121193e7e938e06cd92551c75bbd06..8e6862c41dae9a98f5494dcef0dc6412ef32aaed 100644 (file)
@@ -1408,4 +1408,23 @@ TEST(strrstr) {
         assert_se(!strrstr(p, "xx"));
 }
 
+TEST(str_common_prefix) {
+        ASSERT_EQ(str_common_prefix("", ""), SIZE_MAX);
+        ASSERT_EQ(str_common_prefix("a", "a"), SIZE_MAX);
+        ASSERT_EQ(str_common_prefix("aa", "aa"), SIZE_MAX);
+        ASSERT_EQ(str_common_prefix("aa", "bb"), 0U);
+        ASSERT_EQ(str_common_prefix("bb", "aa"), 0U);
+        ASSERT_EQ(str_common_prefix("aa", "ab"), 1U);
+        ASSERT_EQ(str_common_prefix("ab", "aa"), 1U);
+        ASSERT_EQ(str_common_prefix("systemd-resolved", "systemd-networkd"), 8U);
+        ASSERT_EQ(str_common_prefix("systemd-", "systemd-networkd"), 8U);
+        ASSERT_EQ(str_common_prefix("systemd-networkd", "systemd-"), 8U);
+        ASSERT_EQ(str_common_prefix("syst", "systemd-networkd"), 4U);
+        ASSERT_EQ(str_common_prefix("systemd-networkd", "syst"), 4U);
+        ASSERT_EQ(str_common_prefix("s", "systemd-networkd"), 1U);
+        ASSERT_EQ(str_common_prefix("systemd-networkd", "s"), 1U);
+        ASSERT_EQ(str_common_prefix("", "systemd-networkd"), 0U);
+        ASSERT_EQ(str_common_prefix("systemd-networkd", ""), 0U);
+}
+
 DEFINE_TEST_MAIN(LOG_DEBUG);