summaryrefslogtreecommitdiff
path: root/src/conf.c
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@googlemail.com>2012-08-11 20:52:17 +0200
committerDavid Herrmann <dh.herrmann@googlemail.com>2012-08-11 20:52:17 +0200
commit5c13be3f1d1b1722f35455f4a549da2bdd400cfb (patch)
treee7eb04ac406a7c73b50db4a5341de2c84c74f765 /src/conf.c
parentc65ac64aa5628be2a03e1aebc22600bc22561154 (diff)
conf: move CONF_HAS_ARG flag to config-types
Whether an option takes an argument or not is definitely a property of the type and not of the option. Therefore, move the flag to the type structure and remove it from the option structure. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Diffstat (limited to 'src/conf.c')
-rw-r--r--src/conf.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/conf.c b/src/conf.c
index 317ef18..8267e30 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -48,11 +48,15 @@ struct conf_option;
struct conf_obj conf_global;
static char *def_argv[] = { NULL, "-i", NULL };
+/* config option flags */
#define CONF_DONE 0x0001
#define CONF_LOCKED 0x0002
-#define CONF_HAS_ARG 0x0004
+
+/* config type flags */
+#define CONF_HAS_ARG 0x0001
struct conf_type {
+ unsigned int flags;
int (*parse) (struct conf_option *opt, bool on, const char *arg);
void (*free) (struct conf_option *opt);
void (*set_default) (struct conf_option *opt);
@@ -164,12 +168,14 @@ static void default_string(struct conf_option *opt)
}
static const struct conf_type conf_bool = {
+ .flags = 0,
.parse = parse_bool,
.free = NULL,
.set_default = default_bool,
};
static const struct conf_type conf_string = {
+ .flags = CONF_HAS_ARG,
.parse = parse_string,
.free = free_value,
.set_default = default_string,
@@ -185,7 +191,7 @@ static const struct conf_type conf_string = {
_mem, \
_def)
#define CONF_OPTION_STRING(_short, _long, _mem, _def) \
- CONF_OPTION(CONF_HAS_ARG, \
+ CONF_OPTION(0, \
_short, \
_long, \
&conf_string, \
@@ -260,20 +266,20 @@ int conf_parse_argv(int argc, char **argv)
for (i = 0; i < len; ++i) {
if (options[i].short_name) {
short_options[pos++] = options[i].short_name;
- if (options[i].flags & CONF_HAS_ARG)
+ if (options[i].type->flags & CONF_HAS_ARG)
short_options[pos++] = ':';
}
if (options[i].long_name) {
/* skip the "no-" prefix */
opt->name = &options[i].long_name[3];
- opt->has_arg = !!(options[i].flags & CONF_HAS_ARG);
+ opt->has_arg = !!(options[i].type->flags & CONF_HAS_ARG);
opt->flag = NULL;
opt->val = 100000 + i;
++opt;
/* boolean args are also added with "no-" prefix */
- if (!(options[i].flags & CONF_HAS_ARG)) {
+ if (!(options[i].type->flags & CONF_HAS_ARG)) {
opt->name = options[i].long_name;
opt->has_arg = 0;
opt->flag = NULL;
@@ -303,29 +309,29 @@ int conf_parse_argv(int argc, char **argv)
} else if (c < 100000) {
for (i = 0; i < len; ++i) {
if (options[i].short_name == c) {
- options[i].flags |= CONF_LOCKED;
ret = options[i].type->parse(&options[i],
true,
optarg);
if (ret)
return ret;
+ options[i].flags |= CONF_LOCKED;
options[i].flags |= CONF_DONE;
break;
}
}
} else if (c < 200000) {
i = c - 100000;
- options[i].flags |= CONF_LOCKED;
ret = options[i].type->parse(&options[i], true, optarg);
if (ret)
return ret;
+ options[i].flags |= CONF_LOCKED;
options[i].flags |= CONF_DONE;
} else {
i = c - 200000;
- options[i].flags |= CONF_LOCKED;
ret = options[i].type->parse(&options[i], false, NULL);
if (ret)
return ret;
+ options[i].flags |= CONF_LOCKED;
options[i].flags |= CONF_DONE;
}
}
@@ -384,10 +390,10 @@ static int parse_kv_pair(const char *key, const char *value)
else
continue;
- if (opt->flags & CONF_HAS_ARG && !value) {
+ if (opt->type->flags & CONF_HAS_ARG && !value) {
log_error("config option '%s' requires an argument", key);
return -EFAULT;
- } else if (!(opt->flags & CONF_HAS_ARG) && value) {
+ } else if (!(opt->type->flags & CONF_HAS_ARG) && value) {
log_error("config option '%s' does not take arguments", key);
return -EFAULT;
}