xref: /freebsd/lib/libc/stdlib/twalk.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
18a29851fSPedro F. Giffuni /*	$NetBSD: twalk.c,v 1.4 2012/03/20 16:38:45 matt Exp $	*/
264566a3eSAlfred Perlstein 
364566a3eSAlfred Perlstein /*
464566a3eSAlfred Perlstein  * Tree search generalized from Knuth (6.2.2) Algorithm T just like
564566a3eSAlfred Perlstein  * the AT&T man page says.
664566a3eSAlfred Perlstein  *
764566a3eSAlfred Perlstein  * Written by reading the System V Interface Definition, not the code.
864566a3eSAlfred Perlstein  *
964566a3eSAlfred Perlstein  * Totally public domain.
1064566a3eSAlfred Perlstein  */
1164566a3eSAlfred Perlstein 
1264566a3eSAlfred Perlstein #include <sys/cdefs.h>
13333fc21eSDavid E. O'Brien #if 0
1464566a3eSAlfred Perlstein #if defined(LIBC_SCCS) && !defined(lint)
158a29851fSPedro F. Giffuni __RCSID("$NetBSD: twalk.c,v 1.4 2012/03/20 16:38:45 matt Exp $");
1664566a3eSAlfred Perlstein #endif /* LIBC_SCCS and not lint */
17333fc21eSDavid E. O'Brien #endif
1864566a3eSAlfred Perlstein #define _SEARCH_PRIVATE
1964566a3eSAlfred Perlstein #include <search.h>
2064566a3eSAlfred Perlstein #include <stdlib.h>
2164566a3eSAlfred Perlstein 
22*4ef9bd22SEd Schouten typedef void (*cmp_fn_t)(const posix_tnode *, VISIT, int);
2364566a3eSAlfred Perlstein 
2464566a3eSAlfred Perlstein /* Walk the nodes of a tree */
2564566a3eSAlfred Perlstein static void
trecurse(const posix_tnode * root,cmp_fn_t action,int level)26*4ef9bd22SEd Schouten trecurse(const posix_tnode *root, cmp_fn_t action, int level)
2764566a3eSAlfred Perlstein {
2864566a3eSAlfred Perlstein 
2964566a3eSAlfred Perlstein 	if (root->llink == NULL && root->rlink == NULL)
3064566a3eSAlfred Perlstein 		(*action)(root, leaf, level);
3164566a3eSAlfred Perlstein 	else {
3264566a3eSAlfred Perlstein 		(*action)(root, preorder, level);
3364566a3eSAlfred Perlstein 		if (root->llink != NULL)
3464566a3eSAlfred Perlstein 			trecurse(root->llink, action, level + 1);
3564566a3eSAlfred Perlstein 		(*action)(root, postorder, level);
3664566a3eSAlfred Perlstein 		if (root->rlink != NULL)
3764566a3eSAlfred Perlstein 			trecurse(root->rlink, action, level + 1);
3864566a3eSAlfred Perlstein 		(*action)(root, endorder, level);
3964566a3eSAlfred Perlstein 	}
4064566a3eSAlfred Perlstein }
4164566a3eSAlfred Perlstein 
4264566a3eSAlfred Perlstein /* Walk the nodes of a tree */
4364566a3eSAlfred Perlstein void
twalk(const posix_tnode * vroot,cmp_fn_t action)44*4ef9bd22SEd Schouten twalk(const posix_tnode *vroot, cmp_fn_t action)
4564566a3eSAlfred Perlstein {
4664566a3eSAlfred Perlstein 	if (vroot != NULL && action != NULL)
4764566a3eSAlfred Perlstein 		trecurse(vroot, action, 0);
4864566a3eSAlfred Perlstein }
49