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