Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;
}
Example #5
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;
}
Example #6
0
static int
sorted_btree_clear(btsort_pyobject *self) {
    return traverse_nodes(self, 0, clear_visitor, NULL);
}
Example #7
0
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));
}
Example #8
0
int bs_tree_traverse(bs_tree_t* tree, bs_tree_traverse_t traverse)
{
	if(tree->root) return traverse_nodes(tree->root, traverse);
	return 0;
}