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. --- v2: Drop the macro, avoid __ naming, reduce patch size tools/virsh.c | 21 ++++++++++++--------- 1 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index d2f4020..da975ba 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -280,7 +280,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) @@ -10439,6 +10440,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; @@ -10447,10 +10449,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. */ @@ -11904,20 +11907,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; } -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list