cmd: Add option to add a param at a specific pos
authorSimon Wilkinson <sxw@your-file-system.com>
Tue, 19 Apr 2011 08:01:25 +0000 (09:01 +0100)
committerDerrick Brashear <shadow@dementia.org>
Wed, 27 Apr 2011 19:06:00 +0000 (12:06 -0700)
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 <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 1f41817..c47c63b 100644 (file)
@@ -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)
index ab81211..dfe48a1 100644 (file)
@@ -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,
index ea53eae..d3098a7 100644 (file)
@@ -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;
 }