]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: reduce complexity in argv iteration
authorEric Blake <eblake@redhat.com>
Tue, 14 Jun 2011 17:26:20 +0000 (11:26 -0600)
committerEric Blake <eblake@redhat.com>
Wed, 15 Jun 2011 13:43:01 +0000 (07:43 -0600)
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.

tools/virsh.c

index 19db0580b90e25071a6dc4c5ece9afa9e9a7e14e..1c0b1dc83c3196749e83b06d176413197ae58d03 100644 (file)
@@ -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;
     }