114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng/**********************************************************************
214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  regtrav.c -  Oniguruma (regular expression library)
314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng**********************************************************************/
414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng/*-
514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * Copyright (c) 2002-2004  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>
614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * All rights reserved.
714b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng *
814b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * Redistribution and use in source and binary forms, with or without
914b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * modification, are permitted provided that the following conditions
1014b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * are met:
1114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * 1. Redistributions of source code must retain the above copyright
1214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng *    notice, this list of conditions and the following disclaimer.
1314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * 2. Redistributions in binary form must reproduce the above copyright
1414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng *    notice, this list of conditions and the following disclaimer in the
1514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng *    documentation and/or other materials provided with the distribution.
1614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng *
1714b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1814b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1914b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2014b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2714b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng * SUCH DAMAGE.
2814b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng */
2914b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
3014b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng#include "regint.h"
3114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
3214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng#ifdef USE_CAPTURE_HISTORY
3314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
3414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Shengstatic int
3514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Shengcapture_tree_traverse(OnigCaptureTreeNode* node, int at,
3614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng                      int(*callback_func)(int,int,int,int,int,void*),
3714b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng                      int level, void* arg)
3814b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng{
3914b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  int r, i;
4014b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
4114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  if (node == (OnigCaptureTreeNode* )0)
4214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng    return 0;
4314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
4414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  if ((at & ONIG_TRAVERSE_CALLBACK_AT_FIRST) != 0) {
4514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng    r = (*callback_func)(node->group, node->beg, node->end,
4614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng                         level, ONIG_TRAVERSE_CALLBACK_AT_FIRST, arg);
4714b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng    if (r != 0) return r;
4814b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  }
4914b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
5014b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  for (i = 0; i < node->num_childs; i++) {
5114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng    r = capture_tree_traverse(node->childs[i], at,
5214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng                              callback_func, level + 1, arg);
5314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng    if (r != 0) return r;
5414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  }
5514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
5614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  if ((at & ONIG_TRAVERSE_CALLBACK_AT_LAST) != 0) {
5714b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng    r = (*callback_func)(node->group, node->beg, node->end,
5814b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng                         level, ONIG_TRAVERSE_CALLBACK_AT_LAST, arg);
5914b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng    if (r != 0) return r;
6014b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  }
6114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
6214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  return 0;
6314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng}
6414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng#endif /* USE_CAPTURE_HISTORY */
6514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng
6614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Shengextern int
6714b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Shengonig_capture_tree_traverse(OnigRegion* region, int at,
6814b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng                  int(*callback_func)(int,int,int,int,int,void*), void* arg)
6914b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng{
7014b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng#ifdef USE_CAPTURE_HISTORY
7114b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  return capture_tree_traverse(region->history_root, at,
7214b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng                               callback_func, 0, arg);
7314b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng#else
7414b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng  return ONIG_NO_SUPPORT_CONFIG;
7514b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng#endif
7614b0e5781bd61e905e4d0c988fc4efbbbc8f1ba0Cecil Sheng}
77