Sun, 26 Sep 2021 14:41:49 +0200
implement cx_tree_add_node()
src/cx/tree.h | file | annotate | diff | comparison | revisions | |
src/tree.c | file | annotate | diff | comparison | revisions |
1.1 --- a/src/cx/tree.h Sun Sep 26 14:21:20 2021 +0200 1.2 +++ b/src/cx/tree.h Sun Sep 26 14:41:49 2021 +0200 1.3 @@ -37,6 +37,8 @@ 1.4 extern "C" { 1.5 #endif 1.6 1.7 +void* cx_tree_last(void *node, ptrdiff_t loc_next); 1.8 + 1.9 int cx_tree_add_node(void *node, ptrdiff_t loc_parent, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node); 1.10 1.11 int cx_tree_add_child_node(
2.1 --- a/src/tree.c Sun Sep 26 14:21:20 2021 +0200 2.2 +++ b/src/tree.c Sun Sep 26 14:41:49 2021 +0200 2.3 @@ -28,9 +28,33 @@ 2.4 2.5 #include "cx/tree.h" 2.6 2.7 +#define CX_TR_PTR(cur, off) ((void**)(((char*)cur)+off)) 2.8 + 2.9 +void* cx_tree_last(void *node, ptrdiff_t loc_next) { 2.10 + void *last; 2.11 + do { 2.12 + last = node; 2.13 + } while ((node = *CX_TR_PTR(node, loc_next)) != NULL); 2.14 + return last; 2.15 +} 2.16 2.17 int cx_tree_add_node(void *node, ptrdiff_t loc_parent, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node) { 2.18 - return 1; 2.19 + void *last = cx_tree_last(node, loc_next); 2.20 + if(!last) 2.21 + return 1; 2.22 + 2.23 + // next pointer must be present 2.24 + *CX_TR_PTR(last, loc_next) = new_node; 2.25 + 2.26 + // optional fields 2.27 + if(loc_parent >= 0) { 2.28 + *CX_TR_PTR(new_node, loc_parent) = *CX_TR_PTR(node, loc_parent); 2.29 + } 2.30 + if(loc_prev >= 0) { 2.31 + *CX_TR_PTR(new_node, loc_prev) = last; 2.32 + } 2.33 + 2.34 + return 0; 2.35 } 2.36 2.37 int cx_tree_add_child_node(