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;
+}
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);
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));