summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2011-06-14 11:26:20 -0600
committerEric Blake <eblake@redhat.com>2011-06-15 07:43:01 -0600
commita2ff807a6866e11a39965f96dfe97757f79dba1e (patch)
treec4f00162a3c7e8c82a2e4cb3904dc1268548489f /tools
parentAdd support for network filter code in LXC driver (diff)
downloadlibvirt-a2ff807a6866e11a39965f96dfe97757f79dba1e.tar.gz
libvirt-a2ff807a6866e11a39965f96dfe97757f79dba1e.tar.bz2
libvirt-a2ff807a6866e11a39965f96dfe97757f79dba1e.zip
virsh: reduce complexity in argv iteration
This reduces things from O(n^2) to O(n). * tools/virsh.c (vshCommandOptArgv): Change signature. (cmdEcho): Update caller. Based on a patch by Lai Jiangshan.
Diffstat (limited to 'tools')
-rw-r--r--tools/virsh.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/tools/virsh.c b/tools/virsh.c
index 19db0580b..1c0b1dc83 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -281,7 +281,8 @@ static int vshCommandOptULongLong(const vshCmd *cmd, const char *name,
unsigned long long *value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
static bool vshCommandOptBool(const vshCmd *cmd, const char *name);
-static char *vshCommandOptArgv(const vshCmd *cmd, int count);
+static const vshCmdOpt *vshCommandOptArgv(const vshCmd *cmd,
+ const vshCmdOpt *opt);
#define VSH_BYID (1 << 1)
#define VSH_BYUUID (1 << 2)
@@ -10740,6 +10741,7 @@ cmdEcho (vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd)
bool shell = false;
bool xml = false;
int count = 0;
+ const vshCmdOpt *opt = NULL;
char *arg;
virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -10748,10 +10750,11 @@ cmdEcho (vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd)
if (vshCommandOptBool(cmd, "xml"))
xml = true;
- while ((arg = vshCommandOptArgv(cmd, count)) != NULL) {
+ while ((opt = vshCommandOptArgv(cmd, opt))) {
bool close_quote = false;
char *q;
+ arg = opt->data;
if (count)
virBufferAddChar(&buf, ' ');
/* Add outer '' only if arg included shell metacharacters. */
@@ -12215,20 +12218,20 @@ vshCommandOptBool(const vshCmd *cmd, const char *name)
}
/*
- * Returns the COUNT argv argument, or NULL after last argument.
+ * Returns the next argv argument after OPT (or the first one if OPT
+ * is NULL), or NULL if no more are present.
*
- * Requires that a VSH_OT_ARGV option with the name "" be last in the
+ * Requires that a VSH_OT_ARGV option be last in the
* list of supported options in CMD->def->opts.
*/
-static char *
-vshCommandOptArgv(const vshCmd *cmd, int count)
+static const vshCmdOpt *
+vshCommandOptArgv(const vshCmd *cmd, const vshCmdOpt *opt)
{
- vshCmdOpt *opt = cmd->opts;
+ opt = opt ? opt->next : cmd->opts;
while (opt) {
if (opt->def && opt->def->type == VSH_OT_ARGV) {
- if (count-- == 0)
- return opt->data;
+ return opt;
}
opt = opt->next;
}