| /* | 
 |   tre-internal.h - TRE internal definitions | 
 |  | 
 |   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. | 
 |  | 
 | */ | 
 |  | 
 | #include <regex.h> | 
 | #include <wchar.h> | 
 | #include <wctype.h> | 
 |  | 
 | #undef  TRE_MBSTATE | 
 |  | 
 | #define NDEBUG | 
 |  | 
 | #define TRE_REGEX_T_FIELD __opaque | 
 | typedef int reg_errcode_t; | 
 |  | 
 | typedef wchar_t tre_char_t; | 
 |  | 
 | #define DPRINT(msg) do { } while(0) | 
 |  | 
 | #define elementsof(x)	( sizeof(x) / sizeof(x[0]) ) | 
 |  | 
 | #define tre_mbrtowc(pwc, s, n, ps) (mbtowc((pwc), (s), (n))) | 
 |  | 
 | /* Wide characters. */ | 
 | typedef wint_t tre_cint_t; | 
 | #define TRE_CHAR_MAX 0x10ffff | 
 |  | 
 | #define tre_isalnum iswalnum | 
 | #define tre_isalpha iswalpha | 
 | #define tre_isblank iswblank | 
 | #define tre_iscntrl iswcntrl | 
 | #define tre_isdigit iswdigit | 
 | #define tre_isgraph iswgraph | 
 | #define tre_islower iswlower | 
 | #define tre_isprint iswprint | 
 | #define tre_ispunct iswpunct | 
 | #define tre_isspace iswspace | 
 | #define tre_isupper iswupper | 
 | #define tre_isxdigit iswxdigit | 
 |  | 
 | #define tre_tolower towlower | 
 | #define tre_toupper towupper | 
 | #define tre_strlen  wcslen | 
 |  | 
 | /* Use system provided iswctype() and wctype(). */ | 
 | typedef wctype_t tre_ctype_t; | 
 | #define tre_isctype iswctype | 
 | #define tre_ctype   wctype | 
 |  | 
 | /* Returns number of bytes to add to (char *)ptr to make it | 
 |    properly aligned for the type. */ | 
 | #define ALIGN(ptr, type) \ | 
 |   ((((long)ptr) % sizeof(type)) \ | 
 |    ? (sizeof(type) - (((long)ptr) % sizeof(type))) \ | 
 |    : 0) | 
 |  | 
 | #undef MAX | 
 | #undef MIN | 
 | #define MAX(a, b) (((a) >= (b)) ? (a) : (b)) | 
 | #define MIN(a, b) (((a) <= (b)) ? (a) : (b)) | 
 |  | 
 | /* 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. */ | 
 |   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; | 
 |   /* 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; | 
 |  | 
 | /* 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; | 
 |   char *firstpos_chars; | 
 |   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; | 
 | }; | 
 |  | 
 | /* from tre-mem.h: */ | 
 |  | 
 | #define TRE_MEM_BLOCK_SIZE 1024 | 
 |  | 
 | typedef struct tre_list { | 
 |   void *data; | 
 |   struct tre_list *next; | 
 | } tre_list_t; | 
 |  | 
 | typedef struct tre_mem_struct { | 
 |   tre_list_t *blocks; | 
 |   tre_list_t *current; | 
 |   char *ptr; | 
 |   size_t n; | 
 |   int failed; | 
 |   void **provided; | 
 | } *tre_mem_t; | 
 |  | 
 | #define tre_mem_new_impl   __tre_mem_new_impl | 
 | #define tre_mem_alloc_impl __tre_mem_alloc_impl | 
 | #define tre_mem_destroy    __tre_mem_destroy | 
 |  | 
 | tre_mem_t tre_mem_new_impl(int provided, void *provided_block); | 
 | void *tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block, | 
 | 			 int zero, size_t size); | 
 |  | 
 | /* Returns a new memory allocator or NULL if out of memory. */ | 
 | #define tre_mem_new()  tre_mem_new_impl(0, NULL) | 
 |  | 
 | /* Allocates a block of `size' bytes from `mem'.  Returns a pointer to the | 
 |    allocated block or NULL if an underlying malloc() failed. */ | 
 | #define tre_mem_alloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 0, size) | 
 |  | 
 | /* Allocates a block of `size' bytes from `mem'.  Returns a pointer to the | 
 |    allocated block or NULL if an underlying malloc() failed.  The memory | 
 |    is set to zero. */ | 
 | #define tre_mem_calloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 1, size) | 
 |  | 
 | #ifdef TRE_USE_ALLOCA | 
 | /* alloca() versions.  Like above, but memory is allocated with alloca() | 
 |    instead of malloc(). */ | 
 |  | 
 | #define tre_mem_newa() \ | 
 |   tre_mem_new_impl(1, alloca(sizeof(struct tre_mem_struct))) | 
 |  | 
 | #define tre_mem_alloca(mem, size)					      \ | 
 |   ((mem)->n >= (size)							      \ | 
 |    ? tre_mem_alloc_impl((mem), 1, NULL, 0, (size))			      \ | 
 |    : tre_mem_alloc_impl((mem), 1, alloca(TRE_MEM_BLOCK_SIZE), 0, (size))) | 
 | #endif /* TRE_USE_ALLOCA */ | 
 |  | 
 |  | 
 | /* Frees the memory allocator and all memory allocated with it. */ | 
 | void tre_mem_destroy(tre_mem_t mem); | 
 |  | 
 | #define xmalloc malloc | 
 | #define xcalloc calloc | 
 | #define xfree free | 
 | #define xrealloc realloc | 
 |  |