# HG changeset patch # User Olaf Wintermann # Date 1632660109 -7200 # Node ID 9aa38cd4c992f456099d80edbe960cd397cbf393 # Parent a75b808d653b813fa47ea7a89621da1eb4d92d66 implement cx_tree_add_node() diff -r a75b808d653b -r 9aa38cd4c992 src/cx/tree.h --- a/src/cx/tree.h Sun Sep 26 14:21:20 2021 +0200 +++ b/src/cx/tree.h Sun Sep 26 14:41:49 2021 +0200 @@ -37,6 +37,8 @@ extern "C" { #endif +void* cx_tree_last(void *node, ptrdiff_t loc_next); + int cx_tree_add_node(void *node, ptrdiff_t loc_parent, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node); int cx_tree_add_child_node( diff -r a75b808d653b -r 9aa38cd4c992 src/tree.c --- a/src/tree.c Sun Sep 26 14:21:20 2021 +0200 +++ b/src/tree.c Sun Sep 26 14:41:49 2021 +0200 @@ -28,9 +28,33 @@ #include "cx/tree.h" +#define CX_TR_PTR(cur, off) ((void**)(((char*)cur)+off)) + +void* cx_tree_last(void *node, ptrdiff_t loc_next) { + void *last; + do { + last = node; + } while ((node = *CX_TR_PTR(node, loc_next)) != NULL); + return last; +} int cx_tree_add_node(void *node, ptrdiff_t loc_parent, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) { - return 1; + 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) { + *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(