chiark / gitweb /
conf-parse: add generic parser for strv
authorLennart Poettering <lennart@poettering.net>
Thu, 19 Nov 2009 01:51:44 +0000 (02:51 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 19 Nov 2009 01:51:44 +0000 (02:51 +0100)
conf-parser.c
conf-parser.h

index c45acd770279a30429e78ea389338e8501238dad..e50597491ba4a2e6cce8fef6b5a890fdc5aa302d 100644 (file)
@@ -9,6 +9,7 @@
 #include "conf-parser.h"
 #include "util.h"
 #include "macro.h"
 #include "conf-parser.h"
 #include "util.h"
 #include "macro.h"
+#include "strv.h"
 
 #define WHITESPACE " \t\n"
 #define COMMENTS "#;\n"
 
 #define WHITESPACE " \t\n"
 #define COMMENTS "#;\n"
@@ -319,3 +320,51 @@ int config_parse_string(
 
         return 0;
 }
 
         return 0;
 }
+
+
+int config_parse_strv(
+                const char *filename,
+                unsigned line,
+                const char *section,
+                const char *lvalue,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        char*** sv = data;
+        char **n;
+        char *w;
+        unsigned k;
+        size_t l;
+        char *state;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        k = strv_length(*sv);
+        FOREACH_WORD(w, &l, rvalue, state)
+                k++;
+
+        if (!(n = new(char*, k+1)))
+                return -ENOMEM;
+
+        for (k = 0; (*sv)[k]; k++)
+                n[k] = (*sv)[k];
+        FOREACH_WORD(w, &l, rvalue, state)
+                if (!(n[k++] = strndup(w, l)))
+                        goto fail;
+
+        n[k] = NULL;
+        free(*sv);
+        *sv = n;
+
+        return 0;
+
+fail:
+        for (; k > 0; k--)
+                free(n[k-1]);
+
+        return -ENOMEM;
+}
index 11f537918ffa22bafe7fe30036e8ac237fd7a969..8eb0635f808dfc0dd9e921c25dfc0ada18651ec2 100644 (file)
@@ -29,5 +29,6 @@ int config_parse_unsigned(const char *filename, unsigned line, const char *secti
 int config_parse_size(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
 int config_parse_bool(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
 int config_parse_string(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
 int config_parse_size(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
 int config_parse_bool(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
 int config_parse_string(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
+int config_parse_strv(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata);
 
 #endif
 
 #endif