string-util: add str_common_prefix() helper that determines length of common prefix of two strings

This commit is contained in:
Lennart Poettering
2025-02-05 10:40:06 +01:00
parent 42839efb10
commit f77f363c95
3 changed files with 37 additions and 0 deletions

View 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;
}
}

View 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);

View 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);