162321Salfred/*	$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $	*/
262321Salfred
362321Salfred/*
462321Salfred * Tree search generalized from Knuth (6.2.2) Algorithm T just like
562321Salfred * the AT&T man page says.
662321Salfred *
762321Salfred * The node_t structure is for internal use only, lint doesn't grok it.
862321Salfred *
962321Salfred * Written by reading the System V Interface Definition, not the code.
1062321Salfred *
1162321Salfred * Totally public domain.
1262321Salfred */
1362321Salfred
1462321Salfred#include <sys/cdefs.h>
1592986Sobrien#if 0
1662321Salfred#if defined(LIBC_SCCS) && !defined(lint)
1762321Salfred__RCSID("$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $");
1862321Salfred#endif /* LIBC_SCCS and not lint */
1992986Sobrien#endif
2092986Sobrien__FBSDID("$FreeBSD$");
2162321Salfred
2262321Salfred#define _SEARCH_PRIVATE
2362321Salfred#include <search.h>
2462321Salfred#include <stdlib.h>
2562321Salfred
2692941Sobrienstatic void trecurse(const node_t *,
2792941Sobrien    void (*action)(const void *, VISIT, int), int level);
2862321Salfred
2962321Salfred/* Walk the nodes of a tree */
3062321Salfredstatic void
3162321Salfredtrecurse(root, action, level)
3262321Salfred	const node_t *root;	/* Root of the tree to be walked */
3392905Sobrien	void (*action)(const void *, VISIT, int);
3462321Salfred	int level;
3562321Salfred{
3662321Salfred
3762321Salfred	if (root->llink == NULL && root->rlink == NULL)
3862321Salfred		(*action)(root, leaf, level);
3962321Salfred	else {
4062321Salfred		(*action)(root, preorder, level);
4162321Salfred		if (root->llink != NULL)
4262321Salfred			trecurse(root->llink, action, level + 1);
4362321Salfred		(*action)(root, postorder, level);
4462321Salfred		if (root->rlink != NULL)
4562321Salfred			trecurse(root->rlink, action, level + 1);
4662321Salfred		(*action)(root, endorder, level);
4762321Salfred	}
4862321Salfred}
4962321Salfred
5062321Salfred/* Walk the nodes of a tree */
5162321Salfredvoid
5262321Salfredtwalk(vroot, action)
5362321Salfred	const void *vroot;	/* Root of the tree to be walked */
5492905Sobrien	void (*action)(const void *, VISIT, int);
5562321Salfred{
5662321Salfred	if (vroot != NULL && action != NULL)
5762321Salfred		trecurse(vroot, action, 0);
5862321Salfred}
59