master
  1/*
  2  tre-internal.h - TRE internal definitions
  3
  4  Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi>
  5  All rights reserved.
  6
  7  Redistribution and use in source and binary forms, with or without
  8  modification, are permitted provided that the following conditions
  9  are met:
 10
 11    1. Redistributions of source code must retain the above copyright
 12       notice, this list of conditions and the following disclaimer.
 13
 14    2. Redistributions in binary form must reproduce the above copyright
 15       notice, this list of conditions and the following disclaimer in the
 16       documentation and/or other materials provided with the distribution.
 17
 18  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
 19  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 20  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 21  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
 22  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 23  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 24  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 25  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 26  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 27  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 28  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 29
 30*/
 31
 32#include <regex.h>
 33#include <wchar.h>
 34#include <wctype.h>
 35
 36#undef  TRE_MBSTATE
 37
 38#define NDEBUG
 39
 40#define TRE_REGEX_T_FIELD __opaque
 41typedef int reg_errcode_t;
 42
 43typedef wchar_t tre_char_t;
 44
 45#define DPRINT(msg) do { } while(0)
 46
 47#define elementsof(x)	( sizeof(x) / sizeof(x[0]) )
 48
 49#define tre_mbrtowc(pwc, s, n, ps) (mbtowc((pwc), (s), (n)))
 50
 51/* Wide characters. */
 52typedef wint_t tre_cint_t;
 53#define TRE_CHAR_MAX 0x10ffff
 54
 55#define tre_isalnum iswalnum
 56#define tre_isalpha iswalpha
 57#define tre_isblank iswblank
 58#define tre_iscntrl iswcntrl
 59#define tre_isdigit iswdigit
 60#define tre_isgraph iswgraph
 61#define tre_islower iswlower
 62#define tre_isprint iswprint
 63#define tre_ispunct iswpunct
 64#define tre_isspace iswspace
 65#define tre_isupper iswupper
 66#define tre_isxdigit iswxdigit
 67
 68#define tre_tolower towlower
 69#define tre_toupper towupper
 70#define tre_strlen  wcslen
 71
 72/* Use system provided iswctype() and wctype(). */
 73typedef wctype_t tre_ctype_t;
 74#define tre_isctype iswctype
 75#define tre_ctype   wctype
 76
 77/* Returns number of bytes to add to (char *)ptr to make it
 78   properly aligned for the type. */
 79#define ALIGN(ptr, type) \
 80  ((((long)ptr) % sizeof(type)) \
 81   ? (sizeof(type) - (((long)ptr) % sizeof(type))) \
 82   : 0)
 83
 84#undef MAX
 85#undef MIN
 86#define MAX(a, b) (((a) >= (b)) ? (a) : (b))
 87#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
 88
 89/* TNFA transition type. A TNFA state is an array of transitions,
 90   the terminator is a transition with NULL `state'. */
 91typedef struct tnfa_transition tre_tnfa_transition_t;
 92
 93struct tnfa_transition {
 94  /* Range of accepted characters. */
 95  tre_cint_t code_min;
 96  tre_cint_t code_max;
 97  /* Pointer to the destination state. */
 98  tre_tnfa_transition_t *state;
 99  /* ID number of the destination state. */
100  int state_id;
101  /* -1 terminated array of tags (or NULL). */
102  int *tags;
103  /* Assertion bitmap. */
104  int assertions;
105  /* Assertion parameters. */
106  union {
107    /* Character class assertion. */
108    tre_ctype_t class;
109    /* Back reference assertion. */
110    int backref;
111  } u;
112  /* Negative character class assertions. */
113  tre_ctype_t *neg_classes;
114};
115
116
117/* Assertions. */
118#define ASSERT_AT_BOL		  1   /* Beginning of line. */
119#define ASSERT_AT_EOL		  2   /* End of line. */
120#define ASSERT_CHAR_CLASS	  4   /* Character class in `class'. */
121#define ASSERT_CHAR_CLASS_NEG	  8   /* Character classes in `neg_classes'. */
122#define ASSERT_AT_BOW		 16   /* Beginning of word. */
123#define ASSERT_AT_EOW		 32   /* End of word. */
124#define ASSERT_AT_WB		 64   /* Word boundary. */
125#define ASSERT_AT_WB_NEG	128   /* Not a word boundary. */
126#define ASSERT_BACKREF		256   /* A back reference in `backref'. */
127#define ASSERT_LAST		256
128
129/* Tag directions. */
130typedef enum {
131  TRE_TAG_MINIMIZE = 0,
132  TRE_TAG_MAXIMIZE = 1
133} tre_tag_direction_t;
134
135/* Instructions to compute submatch register values from tag values
136   after a successful match.  */
137struct tre_submatch_data {
138  /* Tag that gives the value for rm_so (submatch start offset). */
139  int so_tag;
140  /* Tag that gives the value for rm_eo (submatch end offset). */
141  int eo_tag;
142  /* List of submatches this submatch is contained in. */
143  int *parents;
144};
145
146typedef struct tre_submatch_data tre_submatch_data_t;
147
148
149/* TNFA definition. */
150typedef struct tnfa tre_tnfa_t;
151
152struct tnfa {
153  tre_tnfa_transition_t *transitions;
154  unsigned int num_transitions;
155  tre_tnfa_transition_t *initial;
156  tre_tnfa_transition_t *final;
157  tre_submatch_data_t *submatch_data;
158  char *firstpos_chars;
159  int first_char;
160  unsigned int num_submatches;
161  tre_tag_direction_t *tag_directions;
162  int *minimal_tags;
163  int num_tags;
164  int num_minimals;
165  int end_tag;
166  int num_states;
167  int cflags;
168  int have_backrefs;
169  int have_approx;
170};
171
172/* from tre-mem.h: */
173
174#define TRE_MEM_BLOCK_SIZE 1024
175
176typedef struct tre_list {
177  void *data;
178  struct tre_list *next;
179} tre_list_t;
180
181typedef struct tre_mem_struct {
182  tre_list_t *blocks;
183  tre_list_t *current;
184  char *ptr;
185  size_t n;
186  int failed;
187  void **provided;
188} *tre_mem_t;
189
190#define tre_mem_new_impl   __tre_mem_new_impl
191#define tre_mem_alloc_impl __tre_mem_alloc_impl
192#define tre_mem_destroy    __tre_mem_destroy
193
194hidden tre_mem_t tre_mem_new_impl(int provided, void *provided_block);
195hidden void *tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
196                                int zero, size_t size);
197
198/* Returns a new memory allocator or NULL if out of memory. */
199#define tre_mem_new()  tre_mem_new_impl(0, NULL)
200
201/* Allocates a block of `size' bytes from `mem'.  Returns a pointer to the
202   allocated block or NULL if an underlying malloc() failed. */
203#define tre_mem_alloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 0, size)
204
205/* Allocates a block of `size' bytes from `mem'.  Returns a pointer to the
206   allocated block or NULL if an underlying malloc() failed.  The memory
207   is set to zero. */
208#define tre_mem_calloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 1, size)
209
210#ifdef TRE_USE_ALLOCA
211/* alloca() versions.  Like above, but memory is allocated with alloca()
212   instead of malloc(). */
213
214#define tre_mem_newa() \
215  tre_mem_new_impl(1, alloca(sizeof(struct tre_mem_struct)))
216
217#define tre_mem_alloca(mem, size)					      \
218  ((mem)->n >= (size)							      \
219   ? tre_mem_alloc_impl((mem), 1, NULL, 0, (size))			      \
220   : tre_mem_alloc_impl((mem), 1, alloca(TRE_MEM_BLOCK_SIZE), 0, (size)))
221#endif /* TRE_USE_ALLOCA */
222
223
224/* Frees the memory allocator and all memory allocated with it. */
225hidden void tre_mem_destroy(tre_mem_t mem);
226
227#define xmalloc malloc
228#define xcalloc calloc
229#define xfree free
230#define xrealloc realloc
231