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