From a338f99fb9bb1eccaf9c256c3ceeca57a9ea3719 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Tue, 27 Sep 2005 03:54:46 +0000 Subject: [PATCH] Fix pseudo handling on rehash (#1305452). git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1497 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 5 +++++ ircd/parse.c | 28 ++++++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 208dff9..bf5a875 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-09-26 Michael Poole + + * ircd/parse.c (del_msg_element): Only delete empty subtrees, and + leave subtrees that may still contain data. + 2005-09-26 Michael Poole * include/channel.h (struct ModeBuf): Add mbm_oplevel to args diff --git a/ircd/parse.c b/ircd/parse.c index 84dc1be..692433b 100644 --- a/ircd/parse.c +++ b/ircd/parse.c @@ -678,20 +678,28 @@ add_msg_element(struct MessageTree *mtree_p, struct Message *msg_p, char *cmd) * @param[in,out] mtree_p Trie node to remove command from. * @param[in] cmd Text of command to remove. */ -void +struct MessageTree * del_msg_element(struct MessageTree *mtree_p, char *cmd) { - struct MessageTree *ntree_p; + int slot = *cmd & (MAXPTRLEN-1); + /* Either remove leaf message or from appropriate child. */ if (*cmd == '\0') - return; - - if ((ntree_p = mtree_p->pointers[*cmd & (MAXPTRLEN-1)]) != NULL) - { - del_msg_element(ntree_p, cmd+1); - MyFree(ntree_p); - mtree_p->pointers[*cmd & (MAXPTRLEN-1)] = NULL; - } + mtree_p->msg = NULL; + else + mtree_p->pointers[slot] = del_msg_element(mtree_p->pointers[slot], cmd + 1); + + /* If current message or any child still exists, keep this node. */ + if (mtree_p->msg) + return mtree_p; + for (slot = 0; slot < MAXPTRLEN; ++slot) + if (mtree_p->pointers[slot]) + return mtree_p; + + /* Otherwise, if we're not a root node, free it and return null. */ + if (mtree_p != &msg_tree && mtree_p != &tok_tree) + MyFree(mtree_p); + return NULL; } /** Initialize the message lookup trie with all known commands. */ -- 2.20.1