All of lore.kernel.org
 help / color / mirror / Atom feed
* 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.