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 } |