From f8570d2b64e72d20c31c29878de0e737cf59dec3 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Tue, 19 Apr 2011 12:20:14 +0100 Subject: [PATCH] cmd: Add parameter aliasing 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 Reviewed-by: Derrick Brashear --- src/cmd/cmd.c | 28 ++++++++++++++++++++++++++++ src/cmd/cmd.p.h | 2 ++ tests/cmd/command-t.c | 17 ++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/cmd/cmd.c b/src/cmd/cmd.c index edd4ec0eb..d8d2107c4 100644 --- a/src/cmd/cmd.c +++ b/src/cmd/cmd.c @@ -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) diff --git a/src/cmd/cmd.p.h b/src/cmd/cmd.p.h index 139d7bc0c..ac5cff1ee 100644 --- a/src/cmd/cmd.p.h +++ b/src/cmd/cmd.p.h @@ -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, diff --git a/tests/cmd/command-t.c b/tests/cmd/command-t.c index c599f4924..b2ea16071 100644 --- a/tests/cmd/command-t.c +++ b/tests/cmd/command-t.c @@ -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; } -- 2.39.5