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