464 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			464 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
    Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
 | 
						|
 | 
						|
    Redistribution and use in source and binary forms, with or without
 | 
						|
    modification, are permitted provided that the following conditions
 | 
						|
    are met:
 | 
						|
    1. Redistributions of source code must retain the above copyright
 | 
						|
       notice, this list of conditions and the following disclaimer.
 | 
						|
    2. Redistributions in binary form must reproduce the above copyright
 | 
						|
       notice, this list of conditions and the following disclaimer in the
 | 
						|
       documentation and/or other materials provided with the distribution.
 | 
						|
 | 
						|
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
						|
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
						|
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
						|
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
						|
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
						|
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
						|
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
						|
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
						|
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
						|
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
  tre-internal.h - TRE internal definitions
 | 
						|
 | 
						|
This is the license, copyright notice, and disclaimer for TRE, a regex
 | 
						|
matching package (library and tools) with support for approximate
 | 
						|
matching.
 | 
						|
 | 
						|
Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi>
 | 
						|
All rights reserved.
 | 
						|
 | 
						|
Redistribution and use in source and binary forms, with or without
 | 
						|
modification, are permitted provided that the following conditions
 | 
						|
are met:
 | 
						|
 | 
						|
  1. Redistributions of source code must retain the above copyright
 | 
						|
     notice, this list of conditions and the following disclaimer.
 | 
						|
 | 
						|
  2. Redistributions in binary form must reproduce the above copyright
 | 
						|
     notice, this list of conditions and the following disclaimer in the
 | 
						|
     documentation and/or other materials provided with the distribution.
 | 
						|
 | 
						|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
 | 
						|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
						|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
						|
A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
 | 
						|
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
						|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
						|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
						|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
						|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
						|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
						|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef _HAWK_TRE_PRV_H_
 | 
						|
#define _HAWK_TRE_PRV_H_
 | 
						|
 | 
						|
/* TODO: MAKE TRE WORK LIKE GNU
 | 
						|
 | 
						|
PATTERN: \(.\{0,1\}\)\(~[^,]*\)\([0-9]\)\(\.*\),\([^;]*\)\(;\([^;]*\(\3[^;]*\)\).*X*\1\(.*\)\)
 | 
						|
INPUT: ~02.,3~3;0123456789;9876543210
 | 
						|
 | 
						|
------------------------------------------------------
 | 
						|
samples/cmn/tre01 gives the following output. this does not seem wrong, though.
 | 
						|
 | 
						|
SUBMATCH[7],[8],[9].
 | 
						|
 | 
						|
SUBMATCH[0] = [~02.,3~3;0123456789;9876543210]
 | 
						|
SUBMATCH[1] = []
 | 
						|
SUBMATCH[2] = [~0]
 | 
						|
SUBMATCH[3] = [2]
 | 
						|
SUBMATCH[4] = [.]
 | 
						|
SUBMATCH[5] = [3~3]
 | 
						|
SUBMATCH[6] = [;0123456789;9876543210]
 | 
						|
SUBMATCH[7] = [012]
 | 
						|
SUBMATCH[8] = [2]
 | 
						|
SUBMATCH[9] = [3456789;9876543210]
 | 
						|
 | 
						|
------------------------------------------------------
 | 
						|
 | 
						|
Using the GNU regcomp(),regexec(), the following
 | 
						|
is printed.
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <regex.h>
 | 
						|
#include <stdio.h>
 | 
						|
int main (int argc, char* argv[])
 | 
						|
{
 | 
						|
     regex_t tre;
 | 
						|
     regmatch_t mat[10];
 | 
						|
     int i;
 | 
						|
     regcomp (&tre, argv[1], 0);
 | 
						|
     regexec (&tre, argv[2], 10, mat, 0);
 | 
						|
     for (i = 0; i < 10; i++)
 | 
						|
     {
 | 
						|
          if (mat[i].rm_so == -1) break;
 | 
						|
          printf ("SUBMATCH[%u] = [%.*s]\n", i,(mat[i].rm_eo - mat[i].rm_so), &argv[2][mat[i].rm_so]);
 | 
						|
     }
 | 
						|
     regfree (&tre);
 | 
						|
     return 0;
 | 
						|
}
 | 
						|
 | 
						|
SUBMATCH[0] = [~02.,3~3;0123456789;9876543210]
 | 
						|
SUBMATCH[1] = []
 | 
						|
SUBMATCH[2] = [~0]
 | 
						|
SUBMATCH[3] = [2]
 | 
						|
SUBMATCH[4] = [.]
 | 
						|
SUBMATCH[5] = [3~3]
 | 
						|
SUBMATCH[6] = [;0123456789;9876543210]
 | 
						|
SUBMATCH[7] = [0123456789]
 | 
						|
SUBMATCH[8] = [23456789]
 | 
						|
SUBMATCH[9] = []
 | 
						|
 | 
						|
 | 
						|
------------------------------------------------------
 | 
						|
One more example here:
 | 
						|
$ ./tre01 "\(x*\)ab\(\(c*\1\)\(.*\)\)" "abcdefg"
 | 
						|
Match: YES
 | 
						|
SUBMATCH[0] = [abcdefg]
 | 
						|
SUBMATCH[1] = []
 | 
						|
SUBMATCH[2] = [cdefg]
 | 
						|
SUBMATCH[3] = []
 | 
						|
SUBMATCH[4] = [cdefg]
 | 
						|
 | 
						|
$ ./reg "\(x*\)ab\(\(c*\1\)\(.*\)\)" "abcdefg"
 | 
						|
SUBMATCH[0] = [abcdefg]
 | 
						|
SUBMATCH[1] = []
 | 
						|
SUBMATCH[2] = [cdefg]
 | 
						|
SUBMATCH[3] = [c]
 | 
						|
SUBMATCH[4] = [defg]
 | 
						|
*/
 | 
						|
 | 
						|
#include <hawk-tre.h>
 | 
						|
#include <hawk-chr.h>
 | 
						|
#include "hawk-prv.h"
 | 
						|
 | 
						|
#if defined(HAWK_OOCH_IS_UCH)
 | 
						|
#	define TRE_WCHAR
 | 
						|
 | 
						|
/*#	define TRE_MULTIBYTE*/
 | 
						|
/*#	define TRE_MBSTATE*/
 | 
						|
#endif
 | 
						|
 | 
						|
#define TRE_REGEX_T_FIELD value
 | 
						|
/*#define assert(x) HAWK_ASSERT(x)*/
 | 
						|
#define assert(x)
 | 
						|
#if defined(NULL)
 | 
						|
#	undef NULL
 | 
						|
#endif
 | 
						|
#define NULL HAWK_NULL
 | 
						|
 | 
						|
#define tre_islower(c)  hawk_is_ooch_lower(c)
 | 
						|
#define tre_isupper(c)  hawk_is_ooch_upper(c)
 | 
						|
#define tre_isalpha(c)  hawk_is_ooch_alpha(c)
 | 
						|
#define tre_isdigit(c)  hawk_is_ooch_digit(c)
 | 
						|
#define tre_isxdigit(c) hawk_is_ooch_xdigit(c)
 | 
						|
#define tre_isalnum(c)  hawk_is_ooch_alnum(c)
 | 
						|
 | 
						|
#define tre_isspace(c)  hawk_is_ooch_space(c)
 | 
						|
#define tre_isprint(c)  hawk_is_ooch_print(c)
 | 
						|
#define tre_isgraph(c)  hawk_is_ooch_graph(c)
 | 
						|
#define tre_iscntrl(c)  hawk_is_ooch_cntrl(c)
 | 
						|
#define tre_ispunct(c)  hawk_is_ooch_punct(c)
 | 
						|
#define tre_isblank(c)  hawk_is_ooch_blank(c)
 | 
						|
 | 
						|
#define tre_tolower(c)  hawk_to_ooch_lower(c)
 | 
						|
#define tre_toupper(c)  hawk_to_ooch_upper(c)
 | 
						|
 | 
						|
typedef hawk_ooch_t tre_char_t;
 | 
						|
typedef hawk_ooci_t tre_cint_t;
 | 
						|
 | 
						|
#define size_t hawk_oow_t
 | 
						|
#define regex_t hawk_tre_t
 | 
						|
#define regmatch_t hawk_tre_match_t
 | 
						|
#define reg_errcode_t hawk_errnum_t
 | 
						|
 | 
						|
#define REG_OK       HAWK_ENOERR
 | 
						|
#define REG_ESPACE   HAWK_ENOMEM
 | 
						|
#define REG_NOMATCH  HAWK_EREXNOMAT
 | 
						|
#define REG_BADPAT   HAWK_EREXBADPAT
 | 
						|
#define REG_ECOLLATE HAWK_EREXCOLLATE
 | 
						|
#define REG_ECTYPE   HAWK_EREXCTYPE
 | 
						|
#define REG_EESCAPE  HAWK_EREXESCAPE
 | 
						|
#define REG_ESUBREG  HAWK_EREXSUBREG
 | 
						|
#define REG_EBRACK   HAWK_EREXBRACK
 | 
						|
#define REG_EPAREN   HAWK_EREXPAREN
 | 
						|
#define REG_EBRACE   HAWK_EREXBRACE
 | 
						|
#define REG_BADBR    HAWK_EREXBADBR
 | 
						|
#define REG_ERANGE   HAWK_EREXRANGE
 | 
						|
#define REG_BADRPT   HAWK_EREXBADRPT
 | 
						|
 | 
						|
/* The maximum number of iterations in a bound expression. */
 | 
						|
#undef RE_DUP_MAX
 | 
						|
#define RE_DUP_MAX 255
 | 
						|
 | 
						|
/* POSIX tre_regcomp() flags. */
 | 
						|
#define REG_EXTENDED    HAWK_TRE_EXTENDED
 | 
						|
#define REG_ICASE       HAWK_TRE_IGNORECASE
 | 
						|
#define REG_NEWLINE     HAWK_TRE_NEWLINE
 | 
						|
#define REG_NOSUB       HAWK_TRE_NOSUBREG
 | 
						|
/* Extra tre_regcomp() flags. */
 | 
						|
#define REG_LITERAL     HAWK_TRE_LITERAL
 | 
						|
#define REG_RIGHT_ASSOC HAWK_TRE_RIGHTASSOC
 | 
						|
#define REG_UNGREEDY    HAWK_TRE_UNGREEDY
 | 
						|
#define REG_NOBOUND     HAWK_TRE_NOBOUND
 | 
						|
#define REG_NONSTDEXT   HAWK_TRE_NONSTDEXT
 | 
						|
 | 
						|
/* POSIX tre_regexec() flags. */
 | 
						|
#define REG_NOTBOL HAWK_TRE_NOTBOL
 | 
						|
#define REG_NOTEOL HAWK_TRE_NOTEOL
 | 
						|
#define REG_BACKTRACKING_MATCHER HAWK_TRE_BACKTRACKING
 | 
						|
 | 
						|
 | 
						|
#define tre_strlen(c) hawk_count_oocstr(c)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/* use the noseterr version because various tre functions return
 | 
						|
 * REG_ESPACE upon memory shortage and the wrapper functions
 | 
						|
 * uses the returned code to set the error number on the
 | 
						|
 * hawk_tre_t wrapper object */
 | 
						|
#define xmalloc(gem,size) hawk_gem_allocmem_noseterr(gem,size)
 | 
						|
#define xrealloc(gem,ptr,new_size) hawk_gem_reallocmem_noseterr(gem, ptr, new_size)
 | 
						|
#define xcalloc(gem,nmemb,size) hawk_gem_callocmem_noseterr(gem, (nmemb) * (size))
 | 
						|
#define xfree(gem,ptr) hawk_gem_freemem(gem,ptr)
 | 
						|
 | 
						|
/* tre-ast.h */
 | 
						|
#define tre_ast_new_node hawk_tre_astnewnode
 | 
						|
#define tre_ast_new_literal hawk_tre_astnewliteral
 | 
						|
#define tre_ast_new_iter hawk_tre_astnewiter
 | 
						|
#define tre_ast_new_union hawk_tre_astnewunion
 | 
						|
#define tre_ast_new_catenation hawk_tre_astnewcatenation
 | 
						|
 | 
						|
/* tre-mem.h */
 | 
						|
#define tre_mem_t hawk_tre_mem_t
 | 
						|
#define tre_mem_new hawk_tre_mem_new
 | 
						|
#define tre_mem_alloc hawk_tre_mem_alloc
 | 
						|
#define tre_mem_calloc hawk_tre_mem_calloc
 | 
						|
#define tre_mem_destroy hawk_tre_mem_destroy
 | 
						|
 | 
						|
/* tre-parse.h */
 | 
						|
#define tre_parse hawk_tre_parse
 | 
						|
 | 
						|
/* tre-stack.h */
 | 
						|
#define tre_stack_destroy hawk_tre_stackfree
 | 
						|
#define tre_stack_new hawk_tre_stacknew
 | 
						|
#define tre_stack_num_objects hawk_tre_stacknumobjs
 | 
						|
#define tre_stack_pop_int hawk_tre_stackpopint
 | 
						|
#define tre_stack_pop_voidptr hawk_tre_stackpopvoidptr
 | 
						|
#define tre_stack_push_int hawk_tre_stackpushint
 | 
						|
#define tre_stack_push_voidptr hawk_tre_stackpushvoidptr
 | 
						|
 | 
						|
/* this tre.h */
 | 
						|
#define tre_compile hawk_tre_compile
 | 
						|
#define tre_free hawk_tre_free
 | 
						|
#define tre_fill_pmatch hawk_tre_fillpmatch
 | 
						|
#define tre_tnfa_run_backtrack hawk_tre_runbacktrack
 | 
						|
#define tre_tnfa_run_parallel hawk_tre_runparallel
 | 
						|
#define tre_have_backrefs hawk_tre_havebackrefs
 | 
						|
 | 
						|
/* Define the character types and functions. */
 | 
						|
#ifdef TRE_WCHAR
 | 
						|
/* [HAWK]
 | 
						|
 * the TRE code uses the int type to represent a code point
 | 
						|
 * in various part. in fact, it uses int, long, tre_cint_t intermixedly.
 | 
						|
 * it's not easy to switch to a single type because lit->code_max is bitwise-ORed
 | 
						|
 * with the assertions field which is of the int type.
 | 
						|
 *
 | 
						|
 * if TRE_CHAR_MAX is greater than INT_MAX, some comparion fails as TRE_CHAR_MAX
 | 
						|
 * is treated as -1. here let me define TRE_CHAR_MAX to avoid this issue.
 | 
						|
 *
 | 
						|
 * however, if int is 2 bytes long,TRE_CHAR_MAX becomes 32767 which is way too small
 | 
						|
 * to represent even upper-half of the  UCS-2 codepoints.
 | 
						|
 */
 | 
						|
#	if (HAWK_SIZEOF_UCH_T < HAWK_SIZEOF_INT)
 | 
						|
#		define TRE_CHAR_MAX HAWK_TYPE_MAX(hawk_uch_t)
 | 
						|
#	else
 | 
						|
#		define TRE_CHAR_MAX HAWK_TYPE_MAX(int)
 | 
						|
#	endif
 | 
						|
 | 
						|
/*
 | 
						|
#	ifdef TRE_MULTIBYTE
 | 
						|
#		define TRE_MB_CUR_MAX (hawk_getmbcurmax())
 | 
						|
#	else
 | 
						|
#		define TRE_MB_CUR_MAX 1
 | 
						|
#	endif
 | 
						|
*/
 | 
						|
#else /* !TRE_WCHAR */
 | 
						|
#	define TRE_CHAR_MAX 255
 | 
						|
/*#	define TRE_MB_CUR_MAX 1*/
 | 
						|
#endif /* !TRE_WCHAR */
 | 
						|
 | 
						|
#define DPRINT(msg)
 | 
						|
 | 
						|
typedef hawk_ooch_prop_t tre_ctype_t;
 | 
						|
#define tre_isctype(c,t) hawk_is_ooch_type(c,t)
 | 
						|
 | 
						|
typedef enum { STR_WIDE, STR_BYTE, STR_MBS } tre_str_type_t;
 | 
						|
 | 
						|
/* Returns number of bytes to add to (char *)ptr to make it
 | 
						|
   properly aligned for the type. */
 | 
						|
#define ALIGN(ptr,type) \
 | 
						|
	((((hawk_uintptr_t)ptr) % HAWK_SIZEOF(type))? \
 | 
						|
	(HAWK_SIZEOF(type) - (((hawk_uintptr_t)ptr) % HAWK_SIZEOF(type))): 0)
 | 
						|
 | 
						|
#undef MAX
 | 
						|
#undef MIN
 | 
						|
#define MAX(a, b) (((a) >= (b)) ? (a) : (b))
 | 
						|
#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
 | 
						|
 | 
						|
/* Define STRF to the correct printf formatter for strings. */
 | 
						|
#ifdef TRE_WCHAR
 | 
						|
#define STRF "ls"
 | 
						|
#else /* !TRE_WCHAR */
 | 
						|
#define STRF "s"
 | 
						|
#endif /* !TRE_WCHAR */
 | 
						|
 | 
						|
/* TNFA transition type. A TNFA state is an array of transitions,
 | 
						|
   the terminator is a transition with NULL `state'. */
 | 
						|
typedef struct tnfa_transition tre_tnfa_transition_t;
 | 
						|
 | 
						|
struct tnfa_transition
 | 
						|
{
 | 
						|
	/* Range of accepted characters. */
 | 
						|
	/* HAWK indicate that code_min .. code_max is not yet negated for ^ in a bracket */
 | 
						|
	int negate_range;
 | 
						|
	/* END HAWK */
 | 
						|
	tre_cint_t code_min;
 | 
						|
	tre_cint_t code_max;
 | 
						|
 | 
						|
	/* Pointer to the destination state. */
 | 
						|
	tre_tnfa_transition_t *state;
 | 
						|
	/* ID number of the destination state. */
 | 
						|
	int state_id;
 | 
						|
	/* -1 terminated array of tags (or NULL). */
 | 
						|
	int *tags;
 | 
						|
	/* Matching parameters settings (or NULL). */
 | 
						|
	int *params;
 | 
						|
	/* Assertion bitmap. */
 | 
						|
	int assertions;
 | 
						|
	/* Assertion parameters. */
 | 
						|
	union
 | 
						|
	{
 | 
						|
		/* Character class assertion. */
 | 
						|
		tre_ctype_t class;
 | 
						|
		/* Back reference assertion. */
 | 
						|
		int backref;
 | 
						|
	} u;
 | 
						|
	/* Negative character class assertions. */
 | 
						|
	tre_ctype_t *neg_classes;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Assertions. */
 | 
						|
#define ASSERT_AT_BOL		  1   /* Beginning of line. */
 | 
						|
#define ASSERT_AT_EOL		  2   /* End of line. */
 | 
						|
#define ASSERT_CHAR_CLASS	  4   /* Character class in `class'. */
 | 
						|
#define ASSERT_CHAR_CLASS_NEG	  8   /* Character classes in `neg_classes'. */
 | 
						|
#define ASSERT_AT_BOW		 16   /* Beginning of word. */
 | 
						|
#define ASSERT_AT_EOW		 32   /* End of word. */
 | 
						|
#define ASSERT_AT_WB		 64   /* Word boundary. */
 | 
						|
#define ASSERT_AT_WB_NEG	128   /* Not a word boundary. */
 | 
						|
#define ASSERT_BACKREF		256   /* A back reference in `backref'. */
 | 
						|
#define ASSERT_LAST		256
 | 
						|
 | 
						|
/* Tag directions. */
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
	TRE_TAG_MINIMIZE = 0,
 | 
						|
	TRE_TAG_MAXIMIZE = 1
 | 
						|
} tre_tag_direction_t;
 | 
						|
 | 
						|
/* Parameters that can be changed dynamically while matching. */
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
	TRE_PARAM_COST_INS	    = 0,
 | 
						|
	TRE_PARAM_COST_DEL	    = 1,
 | 
						|
	TRE_PARAM_COST_SUBST	    = 2,
 | 
						|
	TRE_PARAM_COST_MAX	    = 3,
 | 
						|
	TRE_PARAM_MAX_INS	    = 4,
 | 
						|
	TRE_PARAM_MAX_DEL	    = 5,
 | 
						|
	TRE_PARAM_MAX_SUBST	    = 6,
 | 
						|
	TRE_PARAM_MAX_ERR	    = 7,
 | 
						|
	TRE_PARAM_DEPTH	    = 8,
 | 
						|
	TRE_PARAM_LAST	    = 9
 | 
						|
} tre_param_t;
 | 
						|
 | 
						|
/* Unset matching parameter */
 | 
						|
#define TRE_PARAM_UNSET -1
 | 
						|
 | 
						|
/* Signifies the default matching parameter value. */
 | 
						|
#define TRE_PARAM_DEFAULT -2
 | 
						|
 | 
						|
/* Instructions to compute submatch register values from tag values
 | 
						|
   after a successful match.  */
 | 
						|
struct tre_submatch_data
 | 
						|
{
 | 
						|
	/* Tag that gives the value for rm_so (submatch start offset). */
 | 
						|
	int so_tag;
 | 
						|
	/* Tag that gives the value for rm_eo (submatch end offset). */
 | 
						|
	int eo_tag;
 | 
						|
	/* List of submatches this submatch is contained in. */
 | 
						|
	int *parents;
 | 
						|
};
 | 
						|
 | 
						|
typedef struct tre_submatch_data tre_submatch_data_t;
 | 
						|
 | 
						|
 | 
						|
/* TNFA definition. */
 | 
						|
typedef struct tnfa tre_tnfa_t;
 | 
						|
 | 
						|
struct tnfa
 | 
						|
{
 | 
						|
	tre_tnfa_transition_t *transitions;
 | 
						|
	unsigned int num_transitions;
 | 
						|
	tre_tnfa_transition_t *initial;
 | 
						|
	tre_tnfa_transition_t *final;
 | 
						|
	tre_submatch_data_t *submatch_data;
 | 
						|
#if 0
 | 
						|
	char *firstpos_chars;
 | 
						|
#endif
 | 
						|
	int first_char;
 | 
						|
	unsigned int num_submatches;
 | 
						|
	tre_tag_direction_t *tag_directions;
 | 
						|
	int *minimal_tags;
 | 
						|
	int num_tags;
 | 
						|
	int num_minimals;
 | 
						|
	int end_tag;
 | 
						|
	int num_states;
 | 
						|
	int cflags;
 | 
						|
	int have_backrefs;
 | 
						|
	int have_approx;
 | 
						|
	int params_depth;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
int tre_compile (regex_t *preg, const tre_char_t *regex, size_t n, int cflags);
 | 
						|
 | 
						|
void tre_free (regex_t *preg);
 | 
						|
 | 
						|
void tre_fill_pmatch(
 | 
						|
	size_t nmatch, regmatch_t pmatch[], int cflags,
 | 
						|
	const tre_tnfa_t *tnfa, int *tags, int match_eo);
 | 
						|
 | 
						|
reg_errcode_t tre_tnfa_run_backtrack(
 | 
						|
	hawk_gem_t* gem, const tre_tnfa_t *tnfa, const void *string,
 | 
						|
	int len, tre_str_type_t type, int *match_tags,
 | 
						|
	int eflags, int *match_end_ofs);
 | 
						|
 | 
						|
 | 
						|
reg_errcode_t tre_tnfa_run_parallel(
 | 
						|
	hawk_gem_t* gem, const tre_tnfa_t *tnfa, const void *string, int len,
 | 
						|
	tre_str_type_t type, int *match_tags, int eflags,
 | 
						|
	int *match_end_ofs);
 | 
						|
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/* EOF */
 |