1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-08 08:58:27 +03:00

string-util: add new helper for finding line starting with specific string in a text buffer

We have implemented this manually a couple of times, and always wrong.
Hence let's implement this correctly for once and use everywhere.
This commit is contained in:
Lennart Poettering 2023-03-24 18:02:32 +01:00
parent 32e07cff96
commit 7b82d95f8d
3 changed files with 54 additions and 0 deletions

View File

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

View File

@ -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);

View File

@ -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);