* master - commands: handle including an optional opt multiple times
@ 2017-03-02 20:00 David Teigland
0 siblings, 0 replies; only message in thread
From: David Teigland @ 2017-03-02 20:00 UTC (permalink / raw)
To: lvm-devel
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=6360ba3d2d7b1ab9e32ad5c660473d2a290ef3fd
Commit: 6360ba3d2d7b1ab9e32ad5c660473d2a290ef3fd
Parent: b7831fc14ae9a7b35c1d814486f45f4b3cbadc8b
Author: David Teigland <teigland@redhat.com>
AuthorDate: Thu Mar 2 13:52:06 2017 -0600
Committer: David Teigland <teigland@redhat.com>
CommitterDate: Thu Mar 2 13:52:06 2017 -0600
commands: handle including an optional opt multiple times
When a cmd def includes multiple sets of options (OO_FOO),
allow multiple OO_FOO sets to contain the same option and
avoid repeating it in the cmd def.
---
tools/command.c | 30 +++++++++++++++++++++++++-----
1 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/tools/command.c b/tools/command.c
index a532a10..0187972 100644
--- a/tools/command.c
+++ b/tools/command.c
@@ -845,10 +845,12 @@ static void include_optional_opt_args(struct command *cmd, const char *str)
* This function sets the opt_args.opt value for it.
*/
-static void add_opt_arg(struct command *cmd, char *str, int *takes_arg, int required)
+static void add_opt_arg(struct command *cmd, char *str,
+ int *takes_arg, int *already, int required)
{
char *comma;
int opt;
+ int i;
/* opt_arg.opt set here */
/* opt_arg.def will be set in update_prev_opt_arg() if needed */
@@ -872,6 +874,17 @@ static void add_opt_arg(struct command *cmd, char *str, int *takes_arg, int requ
if (opt == uuidstr_ARG)
opt = uuid_ARG;
+ /* Skip adding an optional opt if it is already included. */
+ if (already && !required) {
+ for (i = 0; i < cmd->oo_count; i++) {
+ if (cmd->optional_opt_args[i].opt == opt) {
+ *already = 1;
+ *takes_arg = opt_names[opt].val_enum ? 1 : 0;
+ return;
+ }
+ }
+ }
+
skip:
if (required > 0)
cmd->required_opt_args[cmd->ro_count++].opt = opt;
@@ -966,13 +979,17 @@ static void update_prev_pos_arg(struct command *cmd, char *str, int required)
static void add_optional_opt_line(struct command *cmd, int argc, char *argv[])
{
int takes_arg = 0;
+ int already;
int i;
for (i = 0; i < argc; i++) {
if (!i && !strncmp(argv[i], "OO:", 3))
continue;
+
+ already = 0;
+
if (is_opt_name(argv[i]))
- add_opt_arg(cmd, argv[i], &takes_arg, OPTIONAL);
+ add_opt_arg(cmd, argv[i], &takes_arg, &already, OPTIONAL);
else if (!strncmp(argv[i], "OO_", 3))
include_optional_opt_args(cmd, argv[i]);
else if (takes_arg)
@@ -983,6 +1000,9 @@ static void add_optional_opt_line(struct command *cmd, int argc, char *argv[])
cmd->cmd_flags |= CMD_FLAG_PARSE_ERROR;
return;
}
+
+ if (already && takes_arg)
+ i++;
}
}
@@ -997,7 +1017,7 @@ static void add_ignore_opt_line(struct command *cmd, int argc, char *argv[])
if (!i && !strncmp(argv[i], "IO:", 3))
continue;
if (is_opt_name(argv[i]))
- add_opt_arg(cmd, argv[i], &takes_arg, IGNORE);
+ add_opt_arg(cmd, argv[i], &takes_arg, NULL, IGNORE);
else if (takes_arg)
update_prev_opt_arg(cmd, argv[i], IGNORE);
else {
@@ -1032,7 +1052,7 @@ static void add_required_opt_line(struct command *cmd, int argc, char *argv[])
for (i = 0; i < argc; i++) {
if (is_opt_name(argv[i]))
- add_opt_arg(cmd, argv[i], &takes_arg, REQUIRED);
+ add_opt_arg(cmd, argv[i], &takes_arg, NULL, REQUIRED);
else if (takes_arg)
update_prev_opt_arg(cmd, argv[i], REQUIRED);
else {
@@ -1090,7 +1110,7 @@ static void add_required_line(struct command *cmd, int argc, char *argv[])
if (is_opt_name(argv[i])) {
/* add new required_opt_arg */
- add_opt_arg(cmd, argv[i], &takes_arg, REQUIRED);
+ add_opt_arg(cmd, argv[i], &takes_arg, NULL, REQUIRED);
prev_was_opt = 1;
prev_was_pos = 0;
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2017-03-02 20:00 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-02 20:00 master - commands: handle including an optional opt multiple times David Teigland
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.