destroycommandtree((CommandTree *)ct->next[i]);
}
}
-
+
+ if(ct->cmd) {
+ if(ct->cmd->command)
+ freesstring(ct->cmd->command);
+ if(ct->cmd->ext && ct->cmd->destroyext)
+ (ct->cmd->destroyext)(ct->cmd->ext);
+ free(ct->cmd);
+ }
free(ct);
}
return sum;
}
+/* sanitisecommandname:
+ *
+ * Converts the given command name to uppercase and checks for bad chars.
+ *
+ * Returns 1 if bad chars were found
+ */
+static int sanitisecommandname(const char *cmdname, char *cmdbuf) {
+ int len,i;
+
+ strncpy(cmdbuf,cmdname,MAX_COMMAND_LEN);
+ cmdbuf[MAX_COMMAND_LEN-1]='\0';
+
+ len=strlen(cmdbuf);
+
+ /* Sanity check the string */
+ for (i=0;i<len;i++) {
+ cmdbuf[i]=toupper(cmdbuf[i]);
+ if (cmdbuf[i]<'A' || cmdbuf[i]>'Z') {
+ /* Someone tried to register an invalid command name */
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
/*
* addcommandhelptotree:
*
* installing it in the tree
*/
-Command *addcommandhelptotree(CommandTree *ct, const char *cmdname, int level, int maxparams, CommandHandler handler, const char *help) {
+Command *addcommandexttotree(CommandTree *ct, const char *cmdname, int level, int maxparams, CommandHandler handler, void *ext) {
Command *nc, *c;
- int i;
-
+ char cmdbuf[MAX_COMMAND_LEN];
+
+ if (sanitisecommandname(cmdname, cmdbuf))
+ return NULL;
+
/* Generate the struct.. */
nc=(void *)malloc(sizeof(Command));
- nc->command=getsstring(cmdname, MAX_COMMAND_LEN);
+ nc->command=getsstring(cmdbuf, MAX_COMMAND_LEN);
nc->level=level;
nc->maxparams=maxparams;
nc->handler=handler;
nc->ext=NULL;
nc->next=NULL;
- if (help) {
- int len=strlen(help);
- nc->help=(char *)malloc(len+1);
- if(nc->help) {
- strncpy(nc->help, help, len);
- nc->help[len] = '\0';
- }
- } else {
- nc->help=NULL;
- }
-
- /* Sanity check the string */
- for (i=0;i<nc->command->length;i++) {
- nc->command->content[i]=toupper(nc->command->content[i]);
- if (nc->command->content[i]<'A' || nc->command->content[i]>'Z') {
- /* Someone tried to register an invalid command name */
- freesstring(nc->command);
- if(nc->help)
- free(nc->help);
- free(nc);
- return NULL;
- }
- }
+ nc->calls=0;
+ nc->destroyext=NULL;
if ((c=findcommandintree(ct,cmdname,1))!=NULL) {
/* Found something already. Append our entry to the end */
} else if (insertcommand(nc,ct,0)) {
/* Erk, that didn't work.. */
freesstring(nc->command);
- if(nc->help)
- free(nc->help);
free(nc);
return NULL;
}
+
+ if (ext)
+ nc->ext=(void *)ext;
return nc;
}
int deletecommandfromtree(CommandTree *ct, const char *cmdname, CommandHandler handler) {
int i;
+ char cmdbuf[MAX_COMMAND_LEN+1];
sstring *tmpstr;
- tmpstr=getsstring(cmdname,MAX_COMMAND_LEN);
+ if (sanitisecommandname(cmdname, cmdbuf))
+ return 1;
- /* Sanity check input string */
- for (i=0;i<tmpstr->length;i++) {
- tmpstr->content[i]=toupper(tmpstr->content[i]);
- if (tmpstr->content[i]<'A' || tmpstr->content[i]>'Z') {
- /* Someone tried to delete an invalid command name */
- freesstring(tmpstr);
- return 1;
- }
- }
+ tmpstr=getsstring(cmdbuf, MAX_COMMAND_LEN);
i=deletecommand(tmpstr,ct,0,handler);
freesstring(tmpstr);
+
return i;
}
c=*ch;
(*ch)=(Command *)((*ch)->next);
freesstring(c->command);
- if(c->help)
- free(c->help);
+ if(c->ext && c->destroyext)
+ (c->destroyext)(c->ext);
free(c);
return 0;
}
c=*ch;
(*ch)=(Command *)((*ch)->next);
freesstring(c->command);
- if(c->help)
- free(c->help);
+ if(c->ext && c->destroyext)
+ (c->destroyext)(c->ext);
free(c);
/* We need to regenerate the final pointer if needed;