string-util: add new strrstr_no_case() call
This commit is contained in:
@@ -1530,6 +1530,17 @@ char* strrstr_internal(const char *haystack, const char *needle) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* strrstr_no_case_internal(const char *haystack, const char *needle) {
|
||||
if (!haystack || !needle)
|
||||
return NULL;
|
||||
|
||||
for (const char *p = strchr(haystack, 0); p > haystack; p--)
|
||||
if (startswith_no_case(p, needle))
|
||||
return (char*) p;
|
||||
|
||||
return startswith_no_case(haystack, needle) ? (char*) haystack : NULL;
|
||||
}
|
||||
|
||||
size_t str_common_prefix(const char *a, const char *b) {
|
||||
assert(a);
|
||||
assert(b);
|
||||
|
||||
@@ -312,4 +312,8 @@ char* strrstr_internal(const char *haystack, const char *needle) _pure_;
|
||||
#define strrstr(haystack, needle) \
|
||||
const_generic(haystack, strrstr_internal(haystack, needle))
|
||||
|
||||
char* strrstr_no_case_internal(const char *haystack, const char *needle) _pure_;
|
||||
#define strrstr_no_case(haystack, needle) \
|
||||
const_generic(haystack, strrstr_no_case_internal(haystack, needle))
|
||||
|
||||
size_t str_common_prefix(const char *a, const char *b) _pure_;
|
||||
|
||||
@@ -535,6 +535,29 @@ TEST(endswith_no_case) {
|
||||
assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
|
||||
}
|
||||
|
||||
TEST(strrstr_no_case) {
|
||||
ASSERT_STREQ(strrstr_no_case("fooBARfoobar", "bar"), "bar");
|
||||
ASSERT_STREQ(strrstr_no_case("fooBARfoobar", "BAR"), "bar");
|
||||
ASSERT_STREQ(strrstr_no_case("fooBARfoobar", "bAR"), "bar");
|
||||
ASSERT_STREQ(strrstr_no_case("fooBARfoobar", "FOO"), "foobar");
|
||||
ASSERT_STREQ(strrstr_no_case("fooBARfoobar", "foo"), "foobar");
|
||||
ASSERT_STREQ(strrstr_no_case("fooBARfoobar", "FoO"), "foobar");
|
||||
ASSERT_STREQ(strrstr_no_case("aXaXa", "x"), "Xa");
|
||||
ASSERT_STREQ(strrstr_no_case("aXaXa", "X"), "Xa");
|
||||
ASSERT_STREQ(strrstr_no_case("xHello", "hello"), "Hello");
|
||||
ASSERT_STREQ(strrstr_no_case("Hello", "l"), "lo");
|
||||
ASSERT_STREQ(strrstr_no_case("Hello", ""), "");
|
||||
ASSERT_STREQ(strrstr_no_case("", ""), "");
|
||||
ASSERT_STREQ(strrstr_no_case("FOO", "foo"), "FOO");
|
||||
ASSERT_STREQ(strrstr_no_case("hello", "hello"), "hello");
|
||||
ASSERT_STREQ(strrstr_no_case("X", "x"), "X");
|
||||
|
||||
ASSERT_NULL(strrstr_no_case("hello", "xyz"));
|
||||
ASSERT_NULL(strrstr_no_case("", "x"));
|
||||
ASSERT_NULL(strrstr_no_case(NULL, "x"));
|
||||
ASSERT_NULL(strrstr_no_case("x", NULL));
|
||||
}
|
||||
|
||||
TEST(delete_chars) {
|
||||
char *s, input[] = " hello, waldo. abc";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user