From: Lennart Poettering Date: Wed, 5 Feb 2025 09:40:06 +0000 (+0100) Subject: string-util: add str_common_prefix() helper that determines length of common prefix... X-Git-Tag: v258-rc1~1322^2~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f77f363c95a8202708ad13822ad79d3c4e2ba1d3;p=thirdparty%2Fsystemd.git string-util: add str_common_prefix() helper that determines length of common prefix of two strings --- diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 7f4be13b62a..4748d5e2b55 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -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; + } +} diff --git a/src/basic/string-util.h b/src/basic/string-util.h index 85f206c689b..d94e52c09da 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -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); diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c index 1b447abda91..8e6862c41da 100644 --- a/src/test/test-string-util.c +++ b/src/test/test-string-util.c @@ -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);