From: Simon Wilkinson Date: Tue, 19 Apr 2011 08:01:25 +0000 (+0100) Subject: cmd: Add option to add a param at a specific pos X-Git-Tag: openafs-devel-1_7_1~541 X-Git-Url: http://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=fae24dabd0f4ae2d072e6a569f7f1f83a8df1d4e cmd: Add option to add a param at a specific pos Rather than having to use cmd_Seek, followed by cmd_AddParam, followed by another cmd_Seek, add a function which permits parameters to be added at specific reference points. This allows programs to declare a list (either as an enum or specific #defines) of parameter code points, rather than using raw numbers. Change-Id: I25c0d501e678aa2818d296c776d8c5d03b8cdabe Reviewed-on: http://gerrit.openafs.org/4542 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/src/cmd/cmd.c b/src/cmd/cmd.c index 1f41817..c47c63b 100644 --- a/src/cmd/cmd.c +++ b/src/cmd/cmd.c @@ -483,14 +483,14 @@ cmd_Seek(struct cmd_syndesc *as, int apos) } int -cmd_AddParm(struct cmd_syndesc *as, char *aname, int atype, - afs_int32 aflags, char *ahelp) +cmd_AddParmAtOffset(struct cmd_syndesc *as, char *aname, int atype, + afs_int32 aflags, char *ahelp, int ref) { struct cmd_parmdesc *tp; - if (as->nParms >= CMD_MAXPARMS) + if (ref >= CMD_MAXPARMS) return CMD_EXCESSPARMS; - tp = &as->parms[as->nParms++]; + tp = &as->parms[ref]; tp->name = malloc(strlen(aname) + 1); assert(tp->name); @@ -504,9 +504,23 @@ cmd_AddParm(struct cmd_syndesc *as, char *aname, int atype, strcpy(tp->help, ahelp); } else tp->help = NULL; + + if (as->nParms <= ref) + as->nParms = ref+1; + return 0; } +int +cmd_AddParm(struct cmd_syndesc *as, char *aname, int atype, + afs_int32 aflags, char *ahelp) +{ + if (as->nParms >= CMD_MAXPARMS) + return CMD_EXCESSPARMS; + + return cmd_AddParmAtOffset(as, aname, atype, aflags, ahelp, as->nParms++); +} + /* 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 ab81211..dfe48a1 100644 --- a/src/cmd/cmd.p.h +++ b/src/cmd/cmd.p.h @@ -72,6 +72,8 @@ extern int cmd_CreateAlias(struct cmd_syndesc *as, char *aname); extern int cmd_Seek(struct cmd_syndesc *as, int apos); 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_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 ea53eae..d3098a7 100644 --- a/tests/cmd/command-t.c +++ b/tests/cmd/command-t.c @@ -57,7 +57,7 @@ main(int argc, char **argv) int code; int tc; - plan(47); + plan(51); initialize_CMD_error_table(); @@ -176,6 +176,19 @@ main(int argc, char **argv) cmd_FreeOptions(&retopts); cmd_FreeArgv(tv); + /* Try adding a couple of parameters at specific positions */ + cmd_AddParmAtOffset(opts, "-fifth", CMD_SINGLE, CMD_OPTIONAL, + "fifth option", 5); + cmd_AddParmAtOffset(opts, "-fourth", CMD_SINGLE, CMD_OPTIONAL, + "fourth option", 4); + code = cmd_ParseLine("-first a -fourth b -fifth c", tv, &tc, 100); + is_int(0, code, "cmd_ParseLine succeeds"); + code = cmd_Parse(tc, tv, &retopts); + is_int(0, code, "parsing our new options succeeds"); + is_string("b", retopts->parms[4].items->data, " Fourth option in right place"); + is_string("c", retopts->parms[5].items->data, " Fifth option in right place"); + cmd_FreeOptions(&retopts); + cmd_FreeArgv(tv); return 0; }