src/tree.c

changeset 472
18f964adad1b
parent 454
4b3219fab71c
child 592
bb69ef3ad1f3
equal deleted inserted replaced
470:e5a4de4f1e03 472:18f964adad1b
27 */ 27 */
28 28
29 #include "cx/tree.h" 29 #include "cx/tree.h"
30 #include "cx/linked_list.h" 30 #include "cx/linked_list.h"
31 31
32 #define CX_TR_PTR(cur, off) ((void**)(((char*)cur)+off)) 32 #define CX_TR_PTR(cur, off) *((void**)(((char*)cur)+off))
33 33
34 void cx_tree_add_sibling(void *node, ptrdiff_t loc_prev, ptrdiff_t loc_next, ptrdiff_t loc_parent, void *new_node) { 34 void cx_tree_add_sibling(void *node, ptrdiff_t loc_prev, ptrdiff_t loc_next, ptrdiff_t loc_parent, void *new_node) {
35 cx_linked_list_add(&node, NULL, loc_prev, loc_next, new_node); 35 cx_linked_list_add(&node, NULL, loc_prev, loc_next, new_node);
36 36
37 // optional parent link 37 // optional parent link
38 if (loc_parent >= 0) { 38 if (loc_parent >= 0) {
39 *CX_TR_PTR(new_node, loc_parent) = *CX_TR_PTR(node, loc_parent); 39 CX_TR_PTR(new_node, loc_parent) = CX_TR_PTR(node, loc_parent);
40 } 40 }
41 } 41 }
42 42
43 void cx_tree_add_child(void **children_begin, void **children_end, 43 void cx_tree_add_child(void **children_begin, void **children_end,
44 ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node, 44 ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node,
45 ptrdiff_t loc_parent, void *parent) { 45 ptrdiff_t loc_parent, void *parent) {
46 cx_linked_list_add(children_begin, children_end, loc_prev, loc_next, new_node); 46 cx_linked_list_add(children_begin, children_end, loc_prev, loc_next, new_node);
47 47
48 // optional parent link 48 // optional parent link
49 if (loc_parent >= 0) { 49 if (loc_parent >= 0) {
50 *CX_TR_PTR(new_node, loc_parent) = parent; 50 CX_TR_PTR(new_node, loc_parent) = parent;
51 } 51 }
52 } 52 }

mercurial