diff options
author | Eric Blake <eblake@redhat.com> | 2011-06-14 11:26:20 -0600 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2011-06-15 07:43:01 -0600 |
commit | a2ff807a6866e11a39965f96dfe97757f79dba1e (patch) | |
tree | c4f00162a3c7e8c82a2e4cb3904dc1268548489f /tools | |
parent | Add support for network filter code in LXC driver (diff) | |
download | libvirt-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.c | 21 |
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; } |