cmd: Add parameter aliasing
authorSimon Wilkinson <sxw@your-file-system.com>
Tue, 19 Apr 2011 11:20:14 +0000 (12:20 +0100)
committerDerrick Brashear <shadow@dementia.org>
Wed, 27 Apr 2011 19:07:45 +0000 (12:07 -0700)
Add support for adding aliases for parameters, in the same way as we
can for syntaxes. This allows multiple different names for a single
option, as well as providing a way around problems with abbreviations.

Aliases may not be abbreviated.

Change-Id: I5c440cf006cd5fd0065ecf1e54213745428063f7
Reviewed-on: http://gerrit.openafs.org/4544
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

src/cmd/cmd.c
src/cmd/cmd.p.h
tests/cmd/command-t.c

index edd4ec0..d8d2107 100644 (file)
@@ -75,6 +75,7 @@ FindType(struct cmd_syndesc *as, char *aname)
     size_t cmdlen;
     int ambig;
     int best;
+    struct cmd_item *alias;
 
     /* Allow --long-style options. */
     if (aname[0] == '-' && aname[1] == '-' && aname[2] && aname[3]) {
@@ -91,6 +92,15 @@ FindType(struct cmd_syndesc *as, char *aname)
            return i;
        if (strlen(as->parms[i].name) < cmdlen)
            continue;
+
+       /* Check for aliases, which must be full matches */
+       alias = as->parms[i].aliases;
+       while (alias != NULL) {
+           if (strcmp(alias->data, aname) == 0)
+               return i;
+           alias = alias->next;
+       }
+
        /* A hidden option must be a full match (no best matches) */
        if (as->parms[i].flags & CMD_HIDE || !enableAbbreviation)
            continue;
@@ -505,6 +515,8 @@ cmd_AddParmAtOffset(struct cmd_syndesc *as, char *aname, int atype,
     } else
        tp->help = NULL;
 
+    tp->aliases = NULL;
+
     if (as->nParms <= ref)
        as->nParms = ref+1;
 
@@ -521,6 +533,22 @@ cmd_AddParm(struct cmd_syndesc *as, char *aname, int atype,
     return cmd_AddParmAtOffset(as, aname, atype, aflags, ahelp, as->nParms++);
 }
 
+int
+cmd_AddParmAlias(struct cmd_syndesc *as, int pos, char *alias)
+{
+    struct cmd_item *item;
+
+    if (pos > as->nParms)
+       return CMD_EXCESSPARMS;
+
+    item = calloc(1, sizeof(struct cmd_item));
+    item->data = strdup(alias);
+    item->next = as->parms[pos].aliases;
+    as->parms[pos].aliases = item;
+
+    return 0;
+}
+
 /* add a text item to the end of the parameter list */
 static int
 AddItem(struct cmd_parmdesc *aparm, char *aval)
index 139d7bc..ac5cff1 100644 (file)
@@ -35,6 +35,7 @@ struct cmd_parmdesc {
     struct cmd_item *items;    /* list of cmd items */
     afs_int32 flags;           /* flags */
     char *help;                        /* optional help descr */
+    struct cmd_item *aliases;   /* optional aliases */
 };
 
 /* cmd_parmdesc flags */
@@ -74,6 +75,7 @@ extern int cmd_AddParm(struct cmd_syndesc *as, char *aname, int atype,
                       afs_int32 aflags, char *ahelp);
 extern int cmd_AddParmAtOffset(struct cmd_syndesc *as, char *name, int atype,
                              afs_int32 aflags, char *ahelp, int ref);
+extern int cmd_AddParmAlias(struct cmd_syndesc *as, int pos, char *alias);
 extern int cmd_Dispatch(int argc, char **argv);
 extern int cmd_FreeArgv(char **argv);
 extern int cmd_ParseLine(char *aline, char **argv, afs_int32 * an,
index c599f49..b2ea160 100644 (file)
@@ -59,7 +59,7 @@ main(int argc, char **argv)
     int retval;
     char *retstring;
 
-    plan(58);
+    plan(62);
 
     initialize_CMD_error_table();
 
@@ -214,6 +214,21 @@ main(int argc, char **argv)
     cmd_FreeOptions(&retopts);
     cmd_FreeArgv(tv);
 
+    /* Add an alias */
+    code = cmd_AddParmAlias(opts, 1, "-twa");
+    is_int(0, code, "cmd_AddParmAlias succeeds");
+
+    code = cmd_ParseLine("-first 1 -twa tup", tv, &tc, 100);
+    is_int(0, code, "cmd_ParseLine succeeds");
+    code = cmd_Parse(tc, tv, &retopts);
+    is_int(0, code, "cmd_Parse succeeds for alias");
+    cmd_OptionAsString(retopts, 1, &retstring);
+    is_string("tup", retstring, " ... and we have the correct value");
+    free(retstring);
+    retstring = NULL;
+
+    cmd_FreeOptions(&retopts);
+    cmd_FreeArgv(tv);
 
     return 0;
 }