X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fsplay_tree.c;h=b9130d6bd784108605a6b6c2bdd2f18b792a59a7;hb=f79cc0e0bba16a3aa42a5fa13098cda714623205;hp=166e5ee68f1405dd96b37566ad9e2b5d41805dd9;hpb=d917c8cb6b69475d568ccbe82389b9f2b3eb5e80;p=meshlink diff --git a/src/splay_tree.c b/src/splay_tree.c index 166e5ee6..b9130d6b 100644 --- a/src/splay_tree.c +++ b/src/splay_tree.c @@ -1,6 +1,6 @@ /* splay_tree.c -- splay tree and linked list convenience - Copyright (C) 2004-2006 Guus Sliepen + Copyright (C) 2014-2017 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ /* Splay operation */ static splay_node_t *splay_top_down(splay_tree_t *tree, const void *data, int *result) { - splay_node_t left = {NULL}, right = {NULL}; + splay_node_t left = {}, right = {}; splay_node_t *leftbottom = &left, *rightbottom = &right, *child, *grandchild; splay_node_t *root = tree->root; int c; @@ -55,7 +55,7 @@ static splay_node_t *splay_top_down(splay_tree_t *tree, const void *data, int *r grandchild->parent = NULL; root = grandchild; - } else if (c > 0 && (grandchild = child->right)) { + } else if(c > 0 && (grandchild = child->right)) { leftbottom->right = child; child->parent = leftbottom; leftbottom = child; @@ -99,7 +99,7 @@ static splay_node_t *splay_top_down(splay_tree_t *tree, const void *data, int *r grandchild->parent = NULL; root = grandchild; - } else if (c < 0 && (grandchild = child->left)) { + } else if(c < 0 && (grandchild = child->left)) { rightbottom->left = child; child->parent = rightbottom; rightbottom = child; @@ -125,9 +125,8 @@ static splay_node_t *splay_top_down(splay_tree_t *tree, const void *data, int *r root = child; break; } - } else { + } else break; - } } /* Merge trees */ @@ -238,7 +237,7 @@ static void splay_bottom_up(splay_tree_t *tree, splay_node_t *node) { splay_tree_t *splay_alloc_tree(splay_compare_t compare, splay_action_t delete) { splay_tree_t *tree; - tree = xmalloc_and_zero(sizeof(splay_tree_t)); + tree = xzalloc(sizeof(splay_tree_t)); tree->compare = compare; tree->delete = delete; @@ -250,7 +249,7 @@ void splay_free_tree(splay_tree_t *tree) { } splay_node_t *splay_alloc_node(void) { - return xmalloc_and_zero(sizeof(splay_node_t)); + return xzalloc(sizeof(splay_node_t)); } void splay_free_node(splay_tree_t *tree, splay_node_t *node) { @@ -328,9 +327,8 @@ splay_node_t *splay_search_closest_node_nosplay(const splay_tree_t *tree, const node = node->right; else break; - } else { + } else break; - } } if(result) @@ -398,6 +396,8 @@ splay_node_t *splay_insert_node(splay_tree_t *tree, splay_node_t *node) { splay_node_t *closest; int result; + node->left = node->right = node->parent = node->next = node->prev = NULL; + if(!tree->root) splay_insert_top(tree, node); else { @@ -418,6 +418,7 @@ splay_node_t *splay_insert_node(splay_tree_t *tree, splay_node_t *node) { void splay_insert_top(splay_tree_t *tree, splay_node_t *node) { node->prev = node->next = node->left = node->right = node->parent = NULL; tree->head = tree->tail = tree->root = node; + tree->count++; } void splay_insert_before(splay_tree_t *tree, splay_node_t *before, splay_node_t *node) { @@ -446,6 +447,7 @@ void splay_insert_before(splay_tree_t *tree, splay_node_t *before, splay_node_t node->parent = NULL; tree->root = node; + tree->count++; } void splay_insert_after(splay_tree_t *tree, splay_node_t *after, splay_node_t *node) { @@ -474,6 +476,7 @@ void splay_insert_after(splay_tree_t *tree, splay_node_t *after, splay_node_t *n node->parent = NULL; tree->root = node; + tree->count++; } splay_node_t *splay_unlink(splay_tree_t *tree, void *data) { @@ -508,9 +511,10 @@ void splay_unlink_node(splay_tree_t *tree, splay_node_t *node) { } else if(node->next) { tree->root = node->right; node->right->parent = NULL; - } else { + } else tree->root = NULL; - } + + tree->count--; } void splay_delete_node(splay_tree_t *tree, splay_node_t *node) {