]> granicus.if.org Git - sudo/commitdiff
Can't use rbapply() for rbdestroy since the destructor is passed a
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Nov 2004 14:49:17 +0000 (14:49 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Nov 2004 14:49:17 +0000 (14:49 +0000)
data pointer, not a node pointer.

redblack.c

index 839b8af36e4769116cccaaf592af8186fdfada6a..5cb7e5b644e7b44412c7b01e4919c66bd1ea3d32 100644 (file)
@@ -35,6 +35,8 @@
 static void rbrepair           __P((struct rbtree *, struct rbnode *));
 static void rotate_left                __P((struct rbtree *, struct rbnode *));
 static void rotate_right       __P((struct rbtree *, struct rbnode *));
+static void _rbdestroy         __P((struct rbtree *, struct rbnode *,
+                                   void (*)(VOID *)));
 
 /*
  * Red-Black tree, see http://en.wikipedia.org/wiki/Red-black_tree
@@ -307,30 +309,33 @@ rbsuccessor(tree, node)
 }
 
 /*
- * Helper function for rbdestroy()
+ * Recursive portion of rbdestroy().
  */
-static int
-_rbdestroy(v1, v2)
-    VOID *v1, *v2;
+static void
+_rbdestroy(tree, node, destroy)
+    struct rbtree *tree;
+    struct rbnode *node;
+    void (*destroy)__P((VOID *));
 {
-    struct rbnode *node = (struct rbnode *) v1;
-    void (*destroy)__P((VOID *)) = (void (*)__P((VOID *))) v2;
-
-    destroy(node);
-    free(node);
-    return(0);
+    if (node != rbnil(tree)) {
+       _rbdestroy(tree, node->left, destroy);
+       _rbdestroy(tree, node->right, destroy);
+       if (destroy != NULL)
+           destroy(node->data);
+       free(node);
+    }
 }
 
 /*
  * Destroy the specified tree, calling the destructor destroy
- * for each node and then freeing it.
+ * for each node and then freeing the tree itself.
  */
 void
 rbdestroy(tree, destroy)
     struct rbtree *tree;
     void (*destroy)__P((VOID *));
 {
-    rbapply(tree, _rbdestroy, (VOID *)destroy, postorder);
+    _rbdestroy(tree, rbfirst(tree), destroy);
     free(tree);
 }