162321Salfred/* $NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos 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) 1762321Salfred__RCSID("$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos 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 2692941Sobrienstatic void trecurse(const node_t *, 2792941Sobrien void (*action)(const void *, VISIT, int), int level); 2862321Salfred 2962321Salfred/* Walk the nodes of a tree */ 3062321Salfredstatic void 3162321Salfredtrecurse(root, action, level) 3262321Salfred const node_t *root; /* Root of the tree to be walked */ 3392905Sobrien void (*action)(const void *, VISIT, int); 3462321Salfred int level; 3562321Salfred{ 3662321Salfred 3762321Salfred if (root->llink == NULL && root->rlink == NULL) 3862321Salfred (*action)(root, leaf, level); 3962321Salfred else { 4062321Salfred (*action)(root, preorder, level); 4162321Salfred if (root->llink != NULL) 4262321Salfred trecurse(root->llink, action, level + 1); 4362321Salfred (*action)(root, postorder, level); 4462321Salfred if (root->rlink != NULL) 4562321Salfred trecurse(root->rlink, action, level + 1); 4662321Salfred (*action)(root, endorder, level); 4762321Salfred } 4862321Salfred} 4962321Salfred 5062321Salfred/* Walk the nodes of a tree */ 5162321Salfredvoid 5262321Salfredtwalk(vroot, action) 5362321Salfred const void *vroot; /* Root of the tree to be walked */ 5492905Sobrien void (*action)(const void *, VISIT, int); 5562321Salfred{ 5662321Salfred if (vroot != NULL && action != NULL) 5762321Salfred trecurse(vroot, action, 0); 5862321Salfred} 59