1 /* Implement twalk using twalk_r.
2    Copyright (C) 2019-2021 Free Software Foundation, Inc.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, see <https://www.gnu.org/licenses/>.
16 */
17 
18 #include <search.h>
19 
20 struct twalk_with_twalk_r_closure
21 {
22   void (*action) (const void *, VISIT, int);
23   int depth;
24 };
25 
26 static void
twalk_with_twalk_r_action(const void * nodep,VISIT which,void * closure0)27 twalk_with_twalk_r_action (const void *nodep, VISIT which, void *closure0)
28 {
29   struct twalk_with_twalk_r_closure *closure = closure0;
30 
31   switch (which)
32     {
33     case leaf:
34       closure->action (nodep, which, closure->depth);
35       break;
36     case preorder:
37       closure->action (nodep, which, closure->depth);
38       ++closure->depth;
39       break;
40     case postorder:
41       /* The preorder action incremented the depth.  */
42       closure->action (nodep, which, closure->depth - 1);
43       break;
44     case endorder:
45       --closure->depth;
46       closure->action (nodep, which, closure->depth);
47       break;
48     }
49 }
50 
51 void
twalk(const void * root,void (* action)(const void *,VISIT,int))52 twalk (const void *root, void (*action) (const void *, VISIT, int))
53 {
54   struct twalk_with_twalk_r_closure closure = { action, 0 };
55   twalk_r (root, twalk_with_twalk_r_action, &closure);
56 }
57