If given an array option without an index either show or set all items,

and support -a for array options. Allow the separator for set to be
specified in the options table (will be used for backwards compatibility
later).
This commit is contained in:
nicm
2017-01-24 19:11:46 +00:00
parent 3d74e89a39
commit 61fce272ea
4 changed files with 79 additions and 43 deletions

View File

@ -160,11 +160,17 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
cmdq_error(item, "not an array: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
}
} else {
if (*name != '@' && options_array_size(parent, NULL) != -1) {
cmdq_error(item, "is an array: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
} else if (*name != '@' && options_array_size(parent, NULL) != -1) {
if (value == NULL) {
cmdq_error(item, "empty value");
return (-1);
}
if (o == NULL)
o = options_empty(oo, options_table_entry(parent));
if (!args_has(args, 'a'))
options_array_clear(o);
options_array_assign(o, value);
return (CMD_RETURN_NORMAL);
}
/* With -o, check this option is not already set. */
@ -197,7 +203,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
else
options_remove(o);
} else
options_array_set(o, idx, NULL);
options_array_set(o, idx, NULL, 0);
} else if (*name == '@')
options_set_string(oo, name, args_has(args, 'a'), "%s", value);
else if (idx == -1) {
@ -207,7 +213,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
} else {
if (o == NULL)
o = options_empty(oo, options_table_entry(parent));
if (options_array_set(o, idx, value) != 0) {
if (options_array_set(o, idx, value, 1) != 0) {
cmdq_error(item, "invalid index: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
}