]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: introduce strprepend() helper
authorMike Yuan <me@yhndnzj.com>
Mon, 10 Feb 2025 18:03:08 +0000 (19:03 +0100)
committerMike Yuan <me@yhndnzj.com>
Mon, 10 Feb 2025 18:39:21 +0000 (19:39 +0100)
src/basic/string-util.c
src/basic/string-util.h
src/test/test-string-util.c

index b2919164d6a9fe192891fd94067dda1fcbbf3073..dace8a606d5d87b6868c2b656c68a9008a31c7e6 100644 (file)
@@ -46,6 +46,20 @@ char* first_word(const char *s, const char *word) {
         return (char*) nw;
 }
 
+char* strprepend(char **x, const char *s) {
+        assert(x);
+
+        if (isempty(s) && *x)
+                return *x;
+
+        char *p = strjoin(strempty(s), *x);
+        if (!p)
+                return NULL;
+
+        free_and_replace(*x, p);
+        return *x;
+}
+
 char* strnappend(const char *s, const char *suffix, size_t b) {
         size_t a;
         char *r;
index 1bcb1c40e320dabc5d7f4e32034d8758eb87ee42..1b2f09706107e2f3b964812f0d813b722cf85f22 100644 (file)
@@ -106,6 +106,8 @@ static inline const char* empty_or_dash_to_null(const char *p) {
 
 char* first_word(const char *s, const char *word) _pure_;
 
+char* strprepend(char **x, const char *s);
+
 char* strnappend(const char *s, const char *suffix, size_t length);
 
 #define strjoin(a, ...) strextend_with_separator_internal(NULL, NULL, a, __VA_ARGS__, NULL)
index fbfb3990e425b43a8726c64624b5f0c263e1a755..1b447abda9121193e7e938e06cd92551c75bbd06 100644 (file)
@@ -1348,6 +1348,19 @@ TEST(strextendn) {
         x = mfree(x);
 }
 
+TEST(strprepend) {
+        _cleanup_free_ char *x = NULL;
+
+        ASSERT_STREQ(strprepend(&x, NULL), "");
+        x = mfree(x);
+
+        ASSERT_STREQ(strprepend(&x, ""), "");
+
+        ASSERT_STREQ(strprepend(&x, "xxx"), "xxx");
+        ASSERT_STREQ(strprepend(&x, "bar"), "barxxx");
+        ASSERT_STREQ(strprepend(&x, "foo"), "foobarxxx");
+}
+
 TEST(strlevenshtein) {
         assert_se(strlevenshtein(NULL, NULL) == 0);
         assert_se(strlevenshtein("", "") == 0);