119304Speter/*	$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $	*/
219304Speter
319304Speter/*
419304Speter * Tree search generalized from Knuth (6.2.2) Algorithm T just like
519304Speter * the AT&T man page says.
619304Speter *
719304Speter * The node_t structure is for internal use only, lint doesn't grok it.
819304Speter *
919304Speter * Written by reading the System V Interface Definition, not the code.
1019304Speter *
1119304Speter * Totally public domain.
1219304Speter */
13254225Speter
1419304Speter#include <sys/cdefs.h>
1519304Speter#if 0
1619304Speter#if defined(LIBC_SCCS) && !defined(lint)
1719304Speter__RCSID("$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $");
18254225Speter#endif /* LIBC_SCCS and not lint */
1919304Speter#endif
2019304Speter__FBSDID("$FreeBSD$");
2119304Speter
2219304Speter#define _SEARCH_PRIVATE
2319304Speter#include <search.h>
2419304Speter#include <stdlib.h>
2519304Speter
2619304Speterstatic void trecurse(const node_t *,
2719304Speter    void (*action)(const void *, VISIT, int), int level);
2819304Speter
29281373Sbapt/* Walk the nodes of a tree */
3019304Speterstatic void
3119304Spetertrecurse(root, action, level)
32254225Speter	const node_t *root;	/* Root of the tree to be walked */
3319304Speter	void (*action)(const void *, VISIT, int);
3419304Speter	int level;
3519304Speter{
3619304Speter
3719304Speter	if (root->llink == NULL && root->rlink == NULL)
3819304Speter		(*action)(root, leaf, level);
3919304Speter	else {
4019304Speter		(*action)(root, preorder, level);
4119304Speter		if (root->llink != NULL)
4219304Speter			trecurse(root->llink, action, level + 1);
4319304Speter		(*action)(root, postorder, level);
4419304Speter		if (root->rlink != NULL)
4519304Speter			trecurse(root->rlink, action, level + 1);
4619304Speter		(*action)(root, endorder, level);
4719304Speter	}
4819304Speter}
4919304Speter
5019304Speter/* Walk the nodes of a tree */
5119304Spetervoid
5219304Spetertwalk(vroot, action)
5319304Speter	const void *vroot;	/* Root of the tree to be walked */
5419304Speter	void (*action)(const void *, VISIT, int);
5519304Speter{
5619304Speter	if (vroot != NULL && action != NULL)
5719304Speter		trecurse(vroot, action, 0);
5819304Speter}
59