static PyObject * python_sorted_btree_repr(PyObject *self) { btsort_pyobject *tree = (btsort_pyobject *)self; PyObject *result; int rc; offsetstring *string; if ((rc = Py_ReprEnter(self))) { if (rc < 0) return NULL; return PyString_FromString("<...>"); } offsetstring_new(string, &rc); if (rc) { PyErr_SetString(PyExc_MemoryError, "failed malloc"); return NULL; } if (traverse_nodes(tree, 1, repr_visit, (void *)string)) result = NULL; else result = PyString_FromStringAndSize( offsetstring_data(string), offsetstring_offset(string) - 1); Py_ReprLeave(self); offsetstring_del(string); return result; }
static void sorted_btree_dealloc(btsort_pyobject *self) { PyObject_GC_UnTrack(self); if (self->flags & BT_FLAG_INITED) traverse_nodes(self, 0, dealloc_visitor, NULL); self->ob_type->tp_free((PyObject *)self); }
static int traverse_nodes(bs_tree_node_t* node, bs_tree_traverse_t traverse) { int rc = 0; if(node->left) { rc = traverse_nodes(node->left, traverse); if(rc != 0) return rc; } if(node->right) { rc = traverse_nodes(node->right, traverse); if(rc != 0) return rc; } return traverse(node); }
/** * ntree_insert - Following the parent path, adds new node * @tree: Points to root of NTree node * @parents: An array of strings, shows path to new node * @data: New string to be stored * Description: The func adds a new node to ntree */ int ntree_insert(NTree **tree, char **parents, char *data) { List *list_node; if (*tree == NULL) { *tree = create_tree_node(data); return 0; } list_node = traverse_nodes(*tree, parents); if ( create_new_list(list_node, data, *tree) == NULL ) { return 1; } return 0; }
/*================================================================= * expand_tree -- Create copy of node tree with additional link info *===============================================================*/ static NODE expand_tree (NODE root0) { NODE copy, node, sub; STRING key; static NODE root; /* root of record being edited */ LIST subs; /* list of contained records */ NODE expd; /* expanded main record - copy - our retval */ root = root0; expd = copy_nodes(root, TRUE, TRUE); subs = create_list(); traverse_nodes(expd, advedit_expand_traverse, subs); /* expand the list of records into the copied record */ FORLIST(subs, el) node = (NODE) el; #ifdef DEBUG llwprintf("in list: %s %s\n", ntag(node), nval(node)); #endif key = rmvat(nval(node)); if ((sub = nztop(key_possible_to_record(key, *key)))) { copy = copy_node_subtree(sub); nxref(node) = nxref(copy); ntag(node) = ntag(copy); nchild(node) = nchild(copy); nparent(node) = nparent(copy); /*MEMORY LEAK; MEMORY LEAK; MEMORY LEAK: node not removed (because its value and possibly xref [probably not] are still being referred to */ } ENDLIST /* Shouldn't we free subs now ? Perry 2001/06/22 */ #ifdef DEBUG show_node(expd); #endif return expd; }
static int sorted_btree_clear(btsort_pyobject *self) { return traverse_nodes(self, 0, clear_visitor, NULL); }
static int sorted_btree_traverse(btsort_pyobject *self, visitproc visit, void *arg) { traverse_payload payload = {visit, arg}; return traverse_nodes(self, 1, traverse_visitor, (void *)(&payload)); }
int bs_tree_traverse(bs_tree_t* tree, bs_tree_traverse_t traverse) { if(tree->root) return traverse_nodes(tree->root, traverse); return 0; }