From: Lennart Poettering Date: Fri, 3 Mar 2023 13:01:02 +0000 (+0100) Subject: string-util: add strrstr() helper X-Git-Tag: v256-rc1~1319^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=63566c6b6ffbb747727db4d6f78c28547430d54f;p=thirdparty%2Fsystemd.git string-util: add strrstr() helper --- diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 7329bfacdf0..f6453990bd9 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -1519,3 +1519,26 @@ ssize_t strlevenshtein(const char *x, const char *y) { return t1[yl]; } + +char *strrstr(const char *haystack, const char *needle) { + const char *f = NULL; + size_t l; + + /* Like strstr() but returns the last rather than the first occurence of "needle" in "haystack". */ + + if (!haystack || !needle) + return NULL; + + l = strlen(needle); + + /* Special case: for the empty string we return the very last possible occurence, i.e. *after* the + * last char, not before. */ + if (l == 0) + return strchr(haystack, 0); + + for (const char *p = haystack; *p; p++) + if (strncmp(p, needle, l) == 0) + f = p; + + return (char*) f; +} diff --git a/src/basic/string-util.h b/src/basic/string-util.h index b6d8be30834..bf427cd7f7a 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -322,3 +322,5 @@ static inline int strdup_or_null(const char *s, char **ret) { *ret = c; return 1; } + +char *strrstr(const char *haystack, const char *needle); diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c index a8fd45df733..e78e299ed29 100644 --- a/src/test/test-string-util.c +++ b/src/test/test-string-util.c @@ -1324,4 +1324,27 @@ TEST(strlevenshtein) { assert_se(strlevenshtein("sunday", "saturday") == 3); } +TEST(strrstr) { + assert_se(!strrstr(NULL, NULL)); + assert_se(!strrstr("foo", NULL)); + assert_se(!strrstr(NULL, "foo")); + + const char *p = "foo"; + assert_se(strrstr(p, "foo") == p); + assert_se(strrstr(p, "fo") == p); + assert_se(strrstr(p, "f") == p); + assert_se(strrstr(p, "oo") == p + 1); + assert_se(strrstr(p, "o") == p + 2); + assert_se(strrstr(p, "") == p + strlen(p)); + assert_se(!strrstr(p, "bar")); + + p = "xoxoxox"; + assert_se(strrstr(p, "") == p + strlen(p)); + assert_se(strrstr(p, "x") == p + 6); + assert_se(strrstr(p, "ox") == p + 5); + assert_se(strrstr(p, "xo") == p + 4); + assert_se(strrstr(p, "xox") == p + 4); + assert_se(!strrstr(p, "xx")); +} + DEFINE_TEST_MAIN(LOG_DEBUG);