diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 71ce921288f..128aea99c02 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -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; +} diff --git a/src/basic/string-util.h b/src/basic/string-util.h index b871224f7b6..60e80484a34 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -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); diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c index 63bb74ac106..00163d501ec 100644 --- a/src/test/test-string-util.c +++ b/src/test/test-string-util.c @@ -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));