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