]> jfr.im git - irc/quakenet/newserv.git/blobdiff - parser/parser.c
CHANSERV: remove accidental sendemail from SETEMAIL command.
[irc/quakenet/newserv.git] / parser / parser.c
index f257a800aa9efe973db47ce73273aab486374876..2a8147616d3be08dfeda268673148f467363627a 100644 (file)
@@ -45,7 +45,14 @@ void destroycommandtree(CommandTree *ct) {
       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);
 }
 
@@ -108,7 +115,7 @@ static int sanitisecommandname(const char *cmdname, char *cmdbuf) {
  * 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;
   char cmdbuf[MAX_COMMAND_LEN];
 
@@ -123,11 +130,8 @@ Command *addcommandhelptotree(CommandTree *ct, const char *cmdname, int level, i
   nc->handler=handler;
   nc->ext=NULL;
   nc->next=NULL;
-  if (help) {
-    nc->help=getsstring(help, 512);
-  } else {
-    nc->help=NULL;
-  }
+  nc->calls=0;
+  nc->destroyext=NULL;
 
   if ((c=findcommandintree(ct,cmdname,1))!=NULL) {
     /* Found something already.  Append our entry to the end */
@@ -137,10 +141,12 @@ Command *addcommandhelptotree(CommandTree *ct, const char *cmdname, int level, i
   } else if (insertcommand(nc,ct,0)) {
     /* Erk, that didn't work.. */
     freesstring(nc->command);
-    freesstring(nc->help);
     free(nc);
     return NULL;
   }
+
+  if (ext)
+    nc->ext=(void *)ext;
   
   return nc;
 }
@@ -230,7 +236,8 @@ int deletecommand(sstring *cmdname, CommandTree *ct, int depth, CommandHandler h
         c=*ch;
         (*ch)=(Command *)((*ch)->next);
         freesstring(c->command);
-        freesstring(c->help);
+        if(c->ext && c->destroyext)
+          (c->destroyext)(c->ext);
         free(c);
         return 0;
       }
@@ -248,7 +255,8 @@ int deletecommand(sstring *cmdname, CommandTree *ct, int depth, CommandHandler h
         c=*ch;
         (*ch)=(Command *)((*ch)->next);
         freesstring(c->command);
-        freesstring(c->help);
+        if(c->ext && c->destroyext)
+          (c->destroyext)(c->ext);
         free(c);
 
         /* We need to regenerate the final pointer if needed;