1268964Spfg/*	$NetBSD: twalk.c,v 1.4 2012/03/20 16:38:45 matt 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)
17268964Spfg__RCSID("$NetBSD: twalk.c,v 1.4 2012/03/20 16:38:45 matt 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
26268964Spfgtypedef void (*cmp_fn_t)(const void *, VISIT, int);
2762321Salfred
2862321Salfred/* Walk the nodes of a tree */
2962321Salfredstatic void
30268964Spfgtrecurse(const node_t *root,	/* Root of the tree to be walked */
31268964Spfg	cmp_fn_t action, int level)
3262321Salfred{
3362321Salfred
3462321Salfred	if (root->llink == NULL && root->rlink == NULL)
3562321Salfred		(*action)(root, leaf, level);
3662321Salfred	else {
3762321Salfred		(*action)(root, preorder, level);
3862321Salfred		if (root->llink != NULL)
3962321Salfred			trecurse(root->llink, action, level + 1);
4062321Salfred		(*action)(root, postorder, level);
4162321Salfred		if (root->rlink != NULL)
4262321Salfred			trecurse(root->rlink, action, level + 1);
4362321Salfred		(*action)(root, endorder, level);
4462321Salfred	}
4562321Salfred}
4662321Salfred
4762321Salfred/* Walk the nodes of a tree */
4862321Salfredvoid
49268964Spfgtwalk(const void *vroot, cmp_fn_t action) /* Root of the tree to be walked */
5062321Salfred{
5162321Salfred	if (vroot != NULL && action != NULL)
5262321Salfred		trecurse(vroot, action, 0);
5362321Salfred}
54