Beispiel #1
0
/*
 * Call func() for each node, passing it the node data and a cookie;
 * If func() returns non-zero for a node, the traversal stops and the
 * error value is returned.  Returns 0 on successful traversal.
 */
int
rbapply_node(struct rbtree *tree, struct rbnode *node,
    int (*func)(void *, void *), void *cookie, enum rbtraversal order)
{
    int error;

    if (node != rbnil(tree)) {
	if (order == preorder)
	    if ((error = func(node->data, cookie)) != 0)
		return error;
	if ((error = rbapply_node(tree, node->left, func, cookie, order)) != 0)
	    return error;
	if (order == inorder)
	    if ((error = func(node->data, cookie)) != 0)
		return error;
	if ((error = rbapply_node(tree, node->right, func, cookie, order)) != 0)
	    return error;
	if (order == postorder)
	    if ((error = func(node->data, cookie)) != 0)
		return error;
    }
    return 0;
}
Beispiel #2
0
/*
 * Call func() for each node, passing it the node data and a cookie;
 * If func() returns non-zero for a node, the traversal stops and the
 * error value is returned.  Returns 0 on successful traversal.
 */
int
rbapply_node(struct rbtree *tree, struct rbnode *node,
    int (*func)(void *, void *), void *cookie, enum rbtraversal order)
{
    int error;
    debug_decl(rbapply_node, SUDO_DEBUG_RBTREE)

    if (node != rbnil(tree)) {
	if (order == preorder)
	    if ((error = func(node->data, cookie)) != 0)
		debug_return_int(error);
	if ((error = rbapply_node(tree, node->left, func, cookie, order)) != 0)
	    debug_return_int(error);
	if (order == inorder)
	    if ((error = func(node->data, cookie)) != 0)
		debug_return_int(error);
	if ((error = rbapply_node(tree, node->right, func, cookie, order)) != 0)
	    debug_return_int(error);
	if (order == postorder)
	    if ((error = func(node->data, cookie)) != 0)
		debug_return_int(error);
    }
    debug_return_int(0);
}