Code

proto: Renamed sdb_proto_get_int to sdb_proto_unmarshal_int.
[sysdb.git] / src / utils / avltree.c
index 56bc57d3087b69bccc42c20fde8cdfcd835f8162..54c1895673a8dd68e6aeccf4655615db00078930 100644 (file)
@@ -36,6 +36,7 @@
 #include <assert.h>
 
 #include <stdlib.h>
+#include <string.h>
 #include <pthread.h>
 
 /*
@@ -66,8 +67,6 @@ struct node {
 struct sdb_avltree {
        pthread_rwlock_t lock;
 
-       sdb_object_cmp_cb cmp;
-
        node_t *root;
        size_t size;
 };
@@ -155,9 +154,30 @@ tree_clear(sdb_avltree_t *tree)
 {
        node_t *n;
 
-       n = node_smallest(tree);
+       if ((! tree) || (! tree->root))
+               return;
+
+       /* do a depth-first iteration and delete the leafs */
+       n = tree->root;
        while (n) {
-               node_t *tmp = node_next(n);
+               node_t *tmp;
+
+               if (n->left) {
+                       n = n->left;
+                       continue;
+               }
+               else if (n->right) {
+                       n = n->right;
+                       continue;
+               }
+
+               tmp = n->parent;
+               if (tmp) {
+                       if (tmp->left == n)
+                               tmp->left = NULL;
+                       else
+                               tmp->right = NULL;
+               }
 
                node_destroy(n);
                n = tmp;
@@ -260,7 +280,7 @@ rebalance(sdb_avltree_t *tree, node_t *n)
  */
 
 sdb_avltree_t *
-sdb_avltree_create(sdb_object_cmp_cb cmp)
+sdb_avltree_create(void)
 {
        sdb_avltree_t *tree;
 
@@ -268,11 +288,7 @@ sdb_avltree_create(sdb_object_cmp_cb cmp)
        if (! tree)
                return NULL;
 
-       if (! cmp)
-               cmp = sdb_object_cmp_by_name;
-
        pthread_rwlock_init(&tree->lock, /* attr = */ NULL);
-       tree->cmp = cmp;
 
        tree->root = NULL;
        tree->size = 0;
@@ -331,7 +347,7 @@ sdb_avltree_insert(sdb_avltree_t *tree, sdb_object_t *obj)
        while (42) {
                assert(parent);
 
-               diff = tree->cmp(obj, parent->obj);
+               diff = strcasecmp(obj->name, parent->obj->name);
                if (! diff) {
                        node_destroy(n);
                        pthread_rwlock_unlock(&tree->lock);
@@ -363,7 +379,7 @@ sdb_avltree_insert(sdb_avltree_t *tree, sdb_object_t *obj)
 } /* sdb_avltree_insert */
 
 sdb_object_t *
-sdb_avltree_lookup(sdb_avltree_t *tree, const sdb_object_t *ref)
+sdb_avltree_lookup(sdb_avltree_t *tree, const char *name)
 {
        node_t *n;
 
@@ -372,7 +388,7 @@ sdb_avltree_lookup(sdb_avltree_t *tree, const sdb_object_t *ref)
 
        n = tree->root;
        while (n) {
-               int diff = tree->cmp(n->obj, ref);
+               int diff = strcasecmp(n->obj->name, name);
 
                if (! diff) {
                        sdb_object_ref(n->obj);
@@ -419,7 +435,7 @@ sdb_avltree_iter_destroy(sdb_avltree_iter_t *iter)
        free(iter);
 } /* sdb_avltree_iter_destroy */
 
-_Bool
+bool
 sdb_avltree_iter_has_next(sdb_avltree_iter_t *iter)
 {
        if (! iter)
@@ -447,12 +463,12 @@ sdb_avltree_size(sdb_avltree_t *tree)
        return tree ? tree->size : 0;
 } /* sdb_avltree_size */
 
-_Bool
+bool
 sdb_avltree_valid(sdb_avltree_t *tree)
 {
        node_t *n;
 
-       _Bool status = 1;
+       bool status = 1;
        size_t size = 0;
 
        if (! tree)