Home | History | Annotate | Download | only in Oniguruma
      1 /**********************************************************************
      2   regtrav.c -  Oniguruma (regular expression library)
      3 **********************************************************************/
      4 /*-
      5  * Copyright (c) 2002-2004  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27  * SUCH DAMAGE.
     28  */
     29 
     30 #include "regint.h"
     31 
     32 #ifdef USE_CAPTURE_HISTORY
     33 
     34 static int
     35 capture_tree_traverse(OnigCaptureTreeNode* node, int at,
     36                       int(*callback_func)(int,int,int,int,int,void*),
     37                       int level, void* arg)
     38 {
     39   int r, i;
     40 
     41   if (node == (OnigCaptureTreeNode* )0)
     42     return 0;
     43 
     44   if ((at & ONIG_TRAVERSE_CALLBACK_AT_FIRST) != 0) {
     45     r = (*callback_func)(node->group, node->beg, node->end,
     46                          level, ONIG_TRAVERSE_CALLBACK_AT_FIRST, arg);
     47     if (r != 0) return r;
     48   }
     49 
     50   for (i = 0; i < node->num_childs; i++) {
     51     r = capture_tree_traverse(node->childs[i], at,
     52                               callback_func, level + 1, arg);
     53     if (r != 0) return r;
     54   }
     55 
     56   if ((at & ONIG_TRAVERSE_CALLBACK_AT_LAST) != 0) {
     57     r = (*callback_func)(node->group, node->beg, node->end,
     58                          level, ONIG_TRAVERSE_CALLBACK_AT_LAST, arg);
     59     if (r != 0) return r;
     60   }
     61 
     62   return 0;
     63 }
     64 #endif /* USE_CAPTURE_HISTORY */
     65 
     66 extern int
     67 onig_capture_tree_traverse(OnigRegion* region, int at,
     68                   int(*callback_func)(int,int,int,int,int,void*), void* arg)
     69 {
     70 #ifdef USE_CAPTURE_HISTORY
     71   return capture_tree_traverse(region->history_root, at,
     72                                callback_func, 0, arg);
     73 #else
     74   return ONIG_NO_SUPPORT_CONFIG;
     75 #endif
     76 }
     77