diff options
-rw-r--r-- | src/basic/string-util.c | 23 | ||||
-rw-r--r-- | src/basic/string-util.h | 2 | ||||
-rw-r--r-- | src/test/test-string-util.c | 29 |
3 files changed, 54 insertions, 0 deletions
diff --git a/src/basic/string-util.c b/src/basic/string-util.c index ad8c9863bd..cc2f8ecdab 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -1260,3 +1260,26 @@ char *strdupcspn(const char *a, const char *reject) { return strndup(a, strcspn(a, reject)); } + +char *find_line_startswith(const char *haystack, const char *needle) { + char *p; + + assert(haystack); + assert(needle); + + /* Finds the first line in 'haystack' that starts with the specified string. Returns a pointer to the + * first character after it */ + + p = strstr(haystack, needle); + if (!p) + return NULL; + + if (p > haystack) + while (p[-1] != '\n') { + p = strstr(p + 1, needle); + if (!p) + return NULL; + } + + return p + strlen(needle); +} diff --git a/src/basic/string-util.h b/src/basic/string-util.h index e0a47a21a9..1755b3275a 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -253,3 +253,5 @@ size_t strspn_from_end(const char *str, const char *accept); char *strdupspn(const char *a, const char *accept); char *strdupcspn(const char *a, const char *reject); + +char *find_line_startswith(const char *haystack, const char *needle); diff --git a/src/test/test-string-util.c b/src/test/test-string-util.c index b3ff7d65c1..9eb048adfa 100644 --- a/src/test/test-string-util.c +++ b/src/test/test-string-util.c @@ -1218,4 +1218,33 @@ TEST(make_cstring) { TEST_MAKE_CSTRING_ONE(test8, -EINVAL, MAKE_CSTRING_REQUIRE_TRAILING_NUL, NULL); } +TEST(find_line_startswith) { + static const char text[] = + "foobar\n" + "this is a test\n" + "foobar: waldo\n" + "more\n" + "\n" + "piff\n" + "foobarfoobar\n" + "iff\n"; + static const char emptystring[] = ""; + + assert_se(find_line_startswith(text, "") == text); + assert_se(find_line_startswith(text, "f") == text+1); + assert_se(find_line_startswith(text, "foobar") == text+6); + assert_se(!find_line_startswith(text, "foobarx")); + assert_se(!find_line_startswith(text, "oobar")); + assert_se(find_line_startswith(text, "t") == text + 8); + assert_se(find_line_startswith(text, "th") == text + 9); + assert_se(find_line_startswith(text, "this") == text + 11); + assert_se(find_line_startswith(text, "foobarf") == text + 54); + assert_se(find_line_startswith(text, "more\n") == text + 41); + assert_se(find_line_startswith(text, "\n") == text + 42); + assert_se(find_line_startswith(text, "iff") == text + 63); + + assert_se(find_line_startswith(emptystring, "") == emptystring); + assert_se(!find_line_startswith(emptystring, "x")); +} + DEFINE_TEST_MAIN(LOG_DEBUG); |