diff -r a10c3e127050 -r bb144d08cd44 src/tree.c --- a/src/tree.c Sun Oct 03 13:07:48 2021 +0200 +++ b/src/tree.c Sun Oct 03 14:06:57 2021 +0200 @@ -31,7 +31,7 @@ #define CX_TR_PTR(cur, off) ((void**)(((char*)cur)+off)) -void* cx_tree_last(void *node, ptrdiff_t loc_next) { +void *cx_tree_last(void *node, ptrdiff_t loc_next) { void *last; do { last = node; @@ -39,40 +39,22 @@ return last; } -int cx_tree_add_node(void *node, ptrdiff_t loc_parent, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) { - void *last = cx_tree_last(node, loc_next); - if(!last) - return 1; - - // next pointer must be present - *CX_TR_PTR(last, loc_next) = new_node; - - // optional fields - if(loc_parent >= 0) { +void cx_tree_add_sibling(void *node, ptrdiff_t loc_prev, ptrdiff_t loc_next, ptrdiff_t loc_parent, void *new_node) { + cx_linked_list_add(&node, NULL, loc_prev, loc_next, new_node); + + // optional parent link + if (loc_parent >= 0) { *CX_TR_PTR(new_node, loc_parent) = *CX_TR_PTR(node, loc_parent); } - if(loc_prev >= 0) { - *CX_TR_PTR(new_node, loc_prev) = last; - } - - return 0; } -int cx_tree_add_child_node( - void *parent, - ptrdiff_t loc_parent, - ptrdiff_t loc_prev, - ptrdiff_t loc_next, - void **children_begin, - void **children_end, - void *new_node) -{ - if(cx_linked_list_add(children_begin, children_end, loc_prev, loc_next, new_node)) { - return 1; - } - // optional field - if(loc_parent >= 0) { +void cx_tree_add_child(void **children_begin, void **children_end, + ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node, + ptrdiff_t loc_parent, void *parent) { + cx_linked_list_add(children_begin, children_end, loc_prev, loc_next, new_node); + + // optional parent link + if (loc_parent >= 0) { *CX_TR_PTR(new_node, loc_parent) = parent; } - return 0; }