This patch adds OPT_STRING_LIST to parse_option in order to support
multiple space seperated string objects in one option.

Signed-off-by: QI Fuli <[email protected]>
---
 ccan/list/list.h     |  6 ++++++
 util/parse-options.c | 25 +++++++++++++++++++++++++
 util/parse-options.h |  3 +++
 3 files changed, 34 insertions(+)

diff --git a/ccan/list/list.h b/ccan/list/list.h
index 4d1d34e..f6c927f 100644
--- a/ccan/list/list.h
+++ b/ccan/list/list.h
@@ -26,6 +26,12 @@ struct list_node
        struct list_node *next, *prev;
 };
 
+struct string_list_node
+{
+       char *str;
+       struct list_node list;
+};
+
 /**
  * struct list_head - the head of a doubly-linked list
  * @h: the list_head (containing next and prev pointers)
diff --git a/util/parse-options.c b/util/parse-options.c
index 751c091..cac18f0 100644
--- a/util/parse-options.c
+++ b/util/parse-options.c
@@ -20,6 +20,7 @@
 #include <util/util.h>
 #include <util/strbuf.h>
 #include <util/parse-options.h>
+#include <ccan/list/list.h>
 
 #define OPT_SHORT 1
 #define OPT_UNSET 2
@@ -695,3 +696,27 @@ int parse_opt_verbosity_cb(const struct option *opt,
        }
        return 0;
 }
+
+int parse_opt_string_list(const struct option *opt, const char *arg, int unset)
+{
+       if (unset)
+               return 0;
+
+       if (!arg)
+               return -1;
+
+       struct list_head *v = opt->value;
+       char *temp = strdup(arg);
+       const char *deli = " ";
+
+       temp = strtok(temp, deli);
+       while (temp != NULL) {
+               struct string_list_node *sln = malloc(sizeof(*sln));
+               sln->str = temp;
+               list_add_tail(v, &sln->list);
+               temp = strtok(NULL, deli);
+       }
+
+       free(temp);
+       return 0;
+}
diff --git a/util/parse-options.h b/util/parse-options.h
index 6fd6b24..10b79cb 100644
--- a/util/parse-options.h
+++ b/util/parse-options.h
@@ -135,6 +135,8 @@ struct option {
 #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), 
.long_name = (l), .value = check_vtype(v, long *), .help = (h) }
 #define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), 
.long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
 #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = 
(s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h) 
}
+#define OPT_STRING_LIST(s, l, v, a, h) \
+       { .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value 
= check_vtype(v, struct list_head *), (a), .help = (h) , 0, 
&parse_opt_string_list }
 #define OPT_DATE(s, l, v, h) \
        { .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value 
= (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
 #define OPT_CALLBACK(s, l, v, a, h, f) \
@@ -206,6 +208,7 @@ extern int parse_options_end(struct parse_opt_ctx_t *ctx);
 extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
 extern int parse_opt_approxidate_cb(const struct option *, const char *, int);
 extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
+extern int parse_opt_string_list(const struct option *, const char *, int);
 
 #define OPT__VERBOSE(var)  OPT_BOOLEAN('v', "verbose", (var), "be verbose")
 #define OPT__QUIET(var)    OPT_BOOLEAN('q', "quiet",   (var), "be quiet")
-- 
2.17.0.140.g0b0cc9f86


_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to