Fixes from Wessel Danker's libavl.
[oweals/tinc.git] / lib / avl_tree.c
index 575b2f1248a8a42a19a71be9d9d2733ca1fbd1bd..7bacc20e111053e97ac238841ad77450b5f36080 100644 (file)
@@ -29,7 +29,7 @@
     library for inclusion into tinc (http://tinc.nl.linux.org/) by
     Guus Sliepen <guus@sliepen.eu.org>.
 
-    $Id: avl_tree.c,v 1.1.2.11 2002/09/09 22:32:24 guus Exp $
+    $Id: avl_tree.c,v 1.1.2.13 2003/06/11 19:39:02 guus Exp $
 */
 
 #include <stdio.h>
@@ -494,15 +494,22 @@ void avl_insert_top(avl_tree_t *tree, avl_node_t *node)
 void avl_insert_before(avl_tree_t *tree, avl_node_t *before,
                                           avl_node_t *node)
 {
-       if(!before)
-               return tree->tail ? avl_insert_after(tree, tree->tail, node) : avl_insert_top(tree, node);
+       if(!before) {
+               if(tree->tail)
+                       avl_insert_after(tree, tree->tail, node);
+               else
+                       avl_insert_top(tree, node);
+               return;
+       }
 
        node->next = before;
        node->parent = before;
        node->prev = before->prev;
 
-       if(before->left)
-               return avl_insert_after(tree, before->prev, node);
+       if(before->left) {
+               avl_insert_after(tree, before->prev, node);
+               return;
+       }
 
        if(before->prev)
                before->prev->next = node;
@@ -512,18 +519,23 @@ void avl_insert_before(avl_tree_t *tree, avl_node_t *before,
        before->prev = node;
        before->left = node;
 
-       avl_rebalance(tree, before->parent);
+       avl_rebalance(tree, before);
 }
 
 void avl_insert_after(avl_tree_t *tree, avl_node_t *after, avl_node_t *node)
 {
-       if(!after)
-               return tree->head ? avl_insert_before(tree, tree->head,
-                                                                                         node) : avl_insert_top(tree,
-                                                                                                                                        node);
+       if(!after) {
+               if(tree->head)
+                       avl_insert_before(tree, tree->head, node);
+               else
+                       avl_insert_top(tree, node);
+               return;
+       }
 
-       if(after->right)
-               return avl_insert_before(tree, after->next, node);
+       if(after->right) {
+               avl_insert_before(tree, after->next, node);
+               return;
+       }
 
        node->prev = after;
        node->parent = after;
@@ -537,7 +549,7 @@ void avl_insert_after(avl_tree_t *tree, avl_node_t *after, avl_node_t *node)
        after->next = node;
        after->right = node;
 
-       avl_rebalance(tree, after->parent);
+       avl_rebalance(tree, after);
 }
 
 avl_node_t *avl_unlink(avl_tree_t *tree, void *data)