]> xenbits.xensource.com Git - xen.git/commitdiff
xl: allow truncation of xl subcommands
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 18 Jun 2010 13:09:14 +0000 (14:09 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 18 Jun 2010 13:09:14 +0000 (14:09 +0100)
for those of us who are used to typing "xm cr foo"

Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
tools/libxl/xl.c
tools/libxl/xl.h
tools/libxl/xl_cmdimpl.c
tools/libxl/xl_cmdtable.c

index 226b0135136cc4775e049da744621605a5d30d42..d00dcefe1d46ab3163174d33116a19f4ccb5057b 100644 (file)
@@ -37,8 +37,9 @@ static xentoollog_level minmsglevel = XTL_PROGRESS;
 
 int main(int argc, char **argv)
 {
-    int opt = 0, i;
+    int opt = 0;
     char *cmd = 0;
+    struct cmd_spec *cspec;
 
     while ((opt = getopt(argc, argv, "+v")) >= 0) {
         switch (opt) {
@@ -69,18 +70,14 @@ int main(int argc, char **argv)
 
     srand(time(0));
 
-    for (i = 0; i < cmdtable_len; i++) {
-        if (!strcmp(cmd, cmd_table[i].cmd_name))
-               cmd_table[i].cmd_impl(argc, argv);
-    }
-
-    if (i >= cmdtable_len) {
-        if (!strcmp(cmd, "help")) {
-            help(argv[2]);
-            exit(0);
-        } else {
-            fprintf(stderr, "command not implemented\n");
-            exit(1);
-        }
+    cspec = cmdtable_lookup(cmd);
+    if (cspec)
+        return cspec->cmd_impl(argc, argv);
+    else if (!strcmp(cmd, "help")) {
+        help(argv[2]);
+        exit(0);
+    } else {
+        fprintf(stderr, "command not implemented\n");
+        exit(1);
     }
 }
index 88561b5a8247773f8db33ff2269052ec00db381f..df5ce0308756e251f93814f9eda92a8f5160bcdd 100644 (file)
@@ -80,6 +80,8 @@ void help(char *command);
 
 extern struct cmd_spec cmd_table[];
 extern int cmdtable_len;
+/* Look up a command in the table, allowing unambiguous truncation */
+struct cmd_spec *cmdtable_lookup(const char *s);
 
 extern struct libxl_ctx ctx;
 extern xentoollog_logger_stdiostream *logger;
index d10c599c1df28060e6a971fc6c25f46766af0674..b0e1341aeb2fa55c7d9887d74f655d0e7dab821d 100644 (file)
@@ -1282,6 +1282,7 @@ error_out:
 void help(char *command)
 {
     int i;
+    struct cmd_spec *cmd;
 
     if (!command || !strcmp(command, "help")) {
         printf("Usage xl <subcommand> [args]\n\n");
@@ -1290,18 +1291,17 @@ void help(char *command)
             printf(" %-20s%s\n",
                    cmd_table[i].cmd_name, cmd_table[i].cmd_desc);
     } else {
-        for (i = 0; i < cmdtable_len; i++)
-            if (!strcmp(command, cmd_table[i].cmd_name))
-                break;
-        if (i == cmdtable_len) {
-            printf("command not implemented\n");
-        } else {
+        cmd = cmdtable_lookup(command);
+        if (cmd) {
             printf("Usage: xl %s %s\n\n%s.\n\n",
-                   cmd_table[i].cmd_name,
-                   cmd_table[i].cmd_usage,
-                   cmd_table[i].cmd_desc);
-            if (cmd_table[i].cmd_option)
-            printf("Options:\n\n%s\n", cmd_table[i].cmd_option);
+                   cmd->cmd_name,
+                   cmd->cmd_usage,
+                   cmd->cmd_desc);
+            if (cmd->cmd_option)
+                printf("Options:\n\n%s\n", cmd->cmd_option);
+        }
+        else {
+            printf("command \"%s\" not implemented\n", command);
         }
     }
 }
index d14993e25bac94c3c176fa4f9d98042954f6eab7..da00cda6630650f1e1f3e2db2a1527442194f5f5 100644 (file)
@@ -12,6 +12,8 @@
  * GNU Lesser General Public License for more details.
  */
 
+#include <string.h>
+
 #include "xl.h"
 
 struct cmd_spec cmd_table[] = {
@@ -308,3 +310,24 @@ struct cmd_spec cmd_table[] = {
 };
 
 int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec);
+
+/* Look up a command in the table, allowing unambiguous truncation */
+struct cmd_spec *cmdtable_lookup(const char *s)
+{
+    struct cmd_spec *cmd = NULL;
+    size_t len;
+    int i;
+
+    if (!s) 
+        return NULL;
+    len = strlen(s);
+    for (i = 0; i < cmdtable_len; i++) {
+        if (!strncmp(s, cmd_table[i].cmd_name, len)) {
+            if (cmd == NULL) 
+                cmd = &cmd_table[i];
+            else 
+                return NULL;
+        }
+    }
+    return cmd;
+}