/* Creates a new node as a child of |dst| on side |dir|. Copies data from |src| into the new node, applying |copy()|, if non-null. Returns nonzero only if fully successful. Regardless of success, integrity of the tree structure is assured, though failure may leave a null pointer in a |tbst_data| member. */ static int copy_node (struct tbst_table *tree, struct tbst_node *dst, int dir, const struct tbst_node *src, tbst_copy_func *copy) { struct tbst_node *new = tree->tbst_alloc->libavl_malloc (tree->tbst_alloc, sizeof *new); if (new == NULL) return 0; new->tbst_link[dir] = dst->tbst_link[dir]; new->tbst_tag[dir] = TBST_THREAD; new->tbst_link[!dir] = dst; new->tbst_tag[!dir] = TBST_THREAD; dst->tbst_link[dir] = new; dst->tbst_tag[dir] = TBST_CHILD; if (copy == NULL) new->tbst_data = src->tbst_data; else { new->tbst_data = copy (src->tbst_data, tree->tbst_param); if (new->tbst_data == NULL) return 0; } return 1; }