]>
Commit | Line | Data |
---|---|---|
1 | /* $NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $ */ | |
2 | ||
3 | /* | |
4 | * Tree search generalized from Knuth (6.2.2) Algorithm T just like | |
5 | * the AT&T man page says. | |
6 | * | |
7 | * The node_t structure is for internal use only, lint doesn't grok it. | |
8 | * | |
9 | * Written by reading the System V Interface Definition, not the code. | |
10 | * | |
11 | * Totally public domain. | |
12 | */ | |
13 | ||
14 | #include <sys/cdefs.h> | |
15 | #if 0 | |
16 | #if defined(LIBC_SCCS) && !defined(lint) | |
17 | __RCSID("$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $"); | |
18 | #endif /* LIBC_SCCS and not lint */ | |
19 | #endif | |
20 | __FBSDID("$FreeBSD: src/lib/libc/stdlib/twalk.c,v 1.5 2003/01/05 02:43:18 tjr Exp $"); | |
21 | ||
22 | #define _SEARCH_PRIVATE | |
23 | #include <search.h> | |
24 | #include <stdlib.h> | |
25 | ||
26 | static void trecurse(const node_t *, | |
27 | void (*action)(const void *, VISIT, int), int level); | |
28 | ||
29 | /* Walk the nodes of a tree */ | |
30 | static void | |
31 | trecurse(root, action, level) | |
32 | const node_t *root; /* Root of the tree to be walked */ | |
33 | void (*action)(const void *, VISIT, int); | |
34 | int level; | |
35 | { | |
36 | ||
37 | if (root->llink == NULL && root->rlink == NULL) | |
38 | (*action)(root, leaf, level); | |
39 | else { | |
40 | (*action)(root, preorder, level); | |
41 | if (root->llink != NULL) | |
42 | trecurse(root->llink, action, level + 1); | |
43 | (*action)(root, postorder, level); | |
44 | if (root->rlink != NULL) | |
45 | trecurse(root->rlink, action, level + 1); | |
46 | (*action)(root, endorder, level); | |
47 | } | |
48 | } | |
49 | ||
50 | /* Walk the nodes of a tree */ | |
51 | void | |
52 | twalk(vroot, action) | |
53 | const void *vroot; /* Root of the tree to be walked */ | |
54 | void (*action)(const void *, VISIT, int); | |
55 | { | |
56 | if (vroot != NULL && action != NULL) | |
57 | trecurse(vroot, action, 0); | |
58 | } |