ucx/tree.c

branch
dav-2
changeset 886
da79af4baec8
parent 854
1c8401ece69e
child 889
42cdbf9bbd49
--- a/ucx/tree.c	Tue Sep 09 16:01:30 2025 +0200
+++ b/ucx/tree.c	Tue Sep 09 20:56:47 2025 +0200
@@ -226,14 +226,14 @@
         int ret_elem = sfunc(elem, node);
         if (ret_elem == 0) {
             // if found, exit the search
-            *result = (void *) elem;
+            *result = elem;
             ret = 0;
             break;
         } else if (ret_elem > 0 && ret_elem < ret) {
             // new distance is better
             *result = elem;
             ret = ret_elem;
-        } else {
+        } else if (ret_elem < 0 || ret_elem > ret) {
             // not contained or distance is worse, skip entire subtree
             cxTreeIteratorContinue(iter);
         }
@@ -305,12 +305,12 @@
 
     if (children == NULL) {
         // search for the next node
-        void *next;
+        void *next = NULL;
         cx_tree_iter_search_next:
-        // check if there is a sibling
+        // check if there is a sibling, but only if we are not a (subtree-)root
         if (iter->exiting) {
             next = iter->node_next;
-        } else {
+        } else if (iter->depth > 1) {
             next = tree_next(iter->node);
             iter->node_next = next;
         }
@@ -326,7 +326,7 @@
                     // invalidate the iterator and free the node stack
                     iter->node = iter->node_next = NULL;
                     iter->stack_capacity = iter->depth = 0;
-                    free(iter->stack);
+                    cxFreeDefault(iter->stack);
                     iter->stack = NULL;
                 } else {
                     // the parent node can be obtained from the top of stack
@@ -386,7 +386,7 @@
     iter.node = root;
     if (root != NULL) {
         iter.stack_capacity = 16;
-        iter.stack = malloc(sizeof(void *) * 16);
+        iter.stack = cxMallocDefault(sizeof(void *) * 16);
         iter.stack[0] = root;
         iter.counter = 1;
         iter.depth = 1;
@@ -416,7 +416,7 @@
     node = tree_next(node);
     while (node != NULL) {
         struct cx_tree_visitor_queue_s *q;
-        q = malloc(sizeof(struct cx_tree_visitor_queue_s));
+        q = cxMallocDefault(sizeof(struct cx_tree_visitor_queue_s));
         q->depth = iter->queue_last->depth;
         q->node = node;
         iter->queue_last->next = q;
@@ -445,7 +445,7 @@
     }
     if (children != NULL) {
         struct cx_tree_visitor_queue_s *q;
-        q = malloc(sizeof(struct cx_tree_visitor_queue_s));
+        q = cxMallocDefault(sizeof(struct cx_tree_visitor_queue_s));
         q->depth = iter->depth + 1;
         q->node = children;
         if (iter->queue_last == NULL) {
@@ -474,7 +474,7 @@
             assert(iter->queue_last == q);
             iter->queue_last = NULL;
         }
-        free(q);
+        cxFreeDefault(q);
     }
 
     // increment the node counter

mercurial