]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: introduce strspn_from_end()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Apr 2022 17:15:01 +0000 (02:15 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Apr 2022 17:15:01 +0000 (02:15 +0900)
src/basic/string-util.c
src/basic/string-util.h
src/test/test-string-util.c

index 71ce921288fe9036eacc070d68de3daf0a56e906..128aea99c02ae6da19a40774c786a280f9b50bae 100644 (file)
@@ -1174,3 +1174,18 @@ char *string_replace_char(char *str, char old_char, char new_char) {
 
         return str;
 }
+
+size_t strspn_from_end(const char *str, const char *accept) {
+        size_t n = 0;
+
+        if (isempty(str))
+                return 0;
+
+        if (isempty(accept))
+                return 0;
+
+        for (const char *p = str + strlen(str); p > str && strchr(accept, p[-1]); p--)
+                n++;
+
+        return n;
+}
index b871224f7b683a8f13ab1ba20a4a2b975fa7c2bd..60e80484a346b92cb5dce760c5a82a2f24c0d0f5 100644 (file)
@@ -235,3 +235,5 @@ static inline int string_contains_word(const char *string, const char *separator
 bool streq_skip_trailing_chars(const char *s1, const char *s2, const char *ok);
 
 char *string_replace_char(char *str, char old_char, char new_char);
+
+size_t strspn_from_end(const char *str, const char *accept);
index 63bb74ac1062fa349eb8bd06f0f7b584b0d26a7f..00163d501ecfc3d8a9b85fa97af6c9836ef4e41a 100644 (file)
@@ -943,6 +943,18 @@ TEST(string_replace_char) {
         assert_se(streq(string_replace_char(strdupa("aaaa"), 'a', '\t'), "\t\t\t\t"));
 }
 
+TEST(strspn_from_end) {
+        assert_se(strspn_from_end(NULL, NULL) == 0);
+        assert_se(strspn_from_end("hoge", NULL) == 0);
+        assert_se(strspn_from_end(NULL, DIGITS) == 0);
+        assert_se(strspn_from_end("", DIGITS) == 0);
+        assert_se(strspn_from_end("hoge", DIGITS) == 0);
+        assert_se(strspn_from_end("1234", DIGITS) == 4);
+        assert_se(strspn_from_end("aaa1234", DIGITS) == 4);
+        assert_se(strspn_from_end("aaa1234aaa", DIGITS) == 0);
+        assert_se(strspn_from_end("aaa12aa34", DIGITS) == 2);
+}
+
 TEST(streq_skip_trailing_chars) {
         /* NULL is WHITESPACE by default*/
         assert_se(streq_skip_trailing_chars("foo bar", "foo bar", NULL));