chiark / gitweb /
shared: inline trivial auto-cleanup functions
[elogind.git] / src / shared / strv.c
index ee0b71e..7bcfabb 100644 (file)
@@ -64,14 +64,6 @@ void strv_free(char **l) {
         free(l);
 }
 
-void strv_freep(char ***l) {
-        if (!l)
-                return;
-
-        strv_free(*l);
-        *l = NULL;
-}
-
 char **strv_copy(char **l) {
         char **r, **k;
 
@@ -305,6 +297,31 @@ char **strv_split_quoted(const char *s) {
         return r;
 }
 
+char **strv_split_newlines(const char *s) {
+        char **l;
+        unsigned n;
+
+        assert(s);
+
+        /* Special version of strv_split() that splits on newlines and
+         * suppresses an empty string at the end */
+
+        l = strv_split(s, NEWLINE);
+        if (!l)
+                return NULL;
+
+        n = strv_length(l);
+        if (n <= 0)
+                return l;
+
+        if (isempty(l[n-1])) {
+                free(l[n-1]);
+                l[n-1] = NULL;
+        }
+
+        return l;
+}
+
 char *strv_join(char **l, const char *separator) {
         char *r, *e;
         char **s;
@@ -504,6 +521,22 @@ char **strv_parse_nulstr(const char *s, size_t l) {
         return v;
 }
 
+char **strv_split_nulstr(const char *s) {
+        const char *i;
+        char **r = NULL;
+
+        NULSTR_FOREACH(i, s)
+                if (strv_extend(&r, i) < 0) {
+                        strv_free(r);
+                        return NULL;
+                }
+
+        if (!r)
+                return strv_new(NULL, NULL);
+
+        return r;
+}
+
 bool strv_overlap(char **a, char **b) {
         char **i, **j;