}
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);
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)
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,
int code;
int tc;
- plan(47);
+ plan(51);
initialize_CMD_error_table();
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;
}