implement cx_tree_add_node()

Sun, 26 Sep 2021 14:41:49 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 26 Sep 2021 14:41:49 +0200
changeset 426
9aa38cd4c992
parent 425
a75b808d653b
child 427
ec92b4ed23aa

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(

mercurial