]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: introduce streq_skip_trailing_chars()
authorAntony Deepak Thomas <antonydeepak@gmail.com>
Wed, 29 Sep 2021 03:57:30 +0000 (12:57 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 29 Sep 2021 03:57:30 +0000 (12:57 +0900)
src/basic/string-util.c
src/basic/string-util.h
src/test/test-string-util.c

index a645958d38539d8bdf3603294ba435464bbe30ff..6ceaeaf9df1a2bbc952f1056f5dd357cf8cd35e7 100644 (file)
@@ -1146,3 +1146,19 @@ int string_contains_word_strv(const char *string, const char *separators, char *
                 *ret_word = found;
         return !!found;
 }
+
+bool streq_skip_trailing_chars(const char *s1, const char *s2, const char *ok) {
+        if (!s1 && !s2)
+                return true;
+        if (!s1 || !s2)
+                return false;
+
+        if (!ok)
+                ok = WHITESPACE;
+
+        for (; *s1 && *s2; s1++, s2++)
+                if (*s1 != *s2)
+                        break;
+
+        return in_charset(s1, ok) && in_charset(s2, ok);
+}
index 5c11adf393f52172bbc4e66f9f8e201967145b84..775d694c6757470a84bd70734eb56148326eac34 100644 (file)
@@ -226,3 +226,5 @@ int string_contains_word_strv(const char *string, const char *separators, char *
 static inline int string_contains_word(const char *string, const char *separators, const char *word) {
         return string_contains_word_strv(string, separators, STRV_MAKE(word), NULL);
 }
+
+bool streq_skip_trailing_chars(const char *s1, const char *s2, const char *ok);
index 4d9d0260c957c5efa688f4ad8b2d9ca4540cc4a9..9a9c974332d41141fa204cd52b12e03252996af5 100644 (file)
@@ -1000,6 +1000,33 @@ static void test_strextendf(void) {
         assert_se(streq(p, "<77>,<99>,<                                                                              88>,<00001234>"));
 }
 
+static void test_streq_skip_trailing_chars(void) {
+        log_info("/* %s */", __func__);
+
+        /* NULL is WHITESPACE by default*/
+        assert_se(streq_skip_trailing_chars("foo bar", "foo bar", NULL));
+        assert_se(streq_skip_trailing_chars("foo", "foo", NULL));
+        assert_se(streq_skip_trailing_chars("foo bar      ", "foo bar", NULL));
+        assert_se(streq_skip_trailing_chars("foo bar", "foo bar\t\t", NULL));
+        assert_se(streq_skip_trailing_chars("foo bar  ", "foo bar\t\t", NULL));
+        assert_se(streq_skip_trailing_chars("foo\nbar", "foo\nbar", NULL));
+        assert_se(streq_skip_trailing_chars("\t\tfoo bar", "\t\tfoo bar", NULL));
+        assert_se(streq_skip_trailing_chars(" foo bar\t", " foo bar\n", NULL));
+
+        assert_se(!streq_skip_trailing_chars("foobar", "foo bar", NULL));
+        assert_se(!streq_skip_trailing_chars("foo\nbar", "foo\tbar", NULL));
+        assert_se(!streq_skip_trailing_chars("\t\nfoo bar", "\t foo bar", NULL));
+
+        assert_se(streq_skip_trailing_chars("foo bar      ", "foo bar", WHITESPACE));
+        assert_se(!streq_skip_trailing_chars("foo bar      ", "foo bar", NEWLINE));
+
+        assert_se(streq_skip_trailing_chars(NULL, NULL, NULL));
+        assert_se(streq_skip_trailing_chars("", "", NULL));
+        assert_se(!streq_skip_trailing_chars(NULL, "foo bar", NULL));
+        assert_se(!streq_skip_trailing_chars("foo", NULL, NULL));
+        assert_se(!streq_skip_trailing_chars("", "f", NULL));
+}
+
 int main(int argc, char *argv[]) {
         test_setup_logging(LOG_DEBUG);
 
@@ -1039,6 +1066,7 @@ int main(int argc, char *argv[]) {
         test_string_contains_word();
         test_strverscmp_improved();
         test_strextendf();
+        test_streq_skip_trailing_chars();
 
         return 0;
 }