(root)/
glibc-2.38/
manual/
examples/
twalk.c
       1  /* Implement twalk using twalk_r.
       2     Copyright (C) 2019-2023 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
      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
      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  }