]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.h
MdeModulePkg: Delete useless case code
[mirror_edk2.git] / MdeModulePkg / Universal / RegularExpressionDxe / Oniguruma / regparse.h
CommitLineData
14b0e578
CS
1#ifndef REGPARSE_H\r
2#define REGPARSE_H\r
3/**********************************************************************\r
4 regparse.h - Oniguruma (regular expression library)\r
5**********************************************************************/\r
6/*-\r
7 * Copyright (c) 2002-2007 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
8 * All rights reserved.\r
9 * \r
0af8e57c 10 * (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
14b0e578
CS
11 *\r
12 * Redistribution and use in source and binary forms, with or without\r
13 * modification, are permitted provided that the following conditions\r
14 * are met:\r
15 * 1. Redistributions of source code must retain the above copyright\r
16 * notice, this list of conditions and the following disclaimer.\r
17 * 2. Redistributions in binary form must reproduce the above copyright\r
18 * notice, this list of conditions and the following disclaimer in the\r
19 * documentation and/or other materials provided with the distribution.\r
20 *\r
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
31 * SUCH DAMAGE.\r
32 */\r
33\r
34#include "regint.h"\r
35\r
36/* node type */\r
37#define NT_STR 0\r
38#define NT_CCLASS 1\r
39#define NT_CTYPE 2\r
40#define NT_CANY 3\r
41#define NT_BREF 4\r
42#define NT_QTFR 5\r
43#define NT_ENCLOSE 6\r
44#define NT_ANCHOR 7\r
45#define NT_LIST 8\r
46#define NT_ALT 9\r
47#define NT_CALL 10\r
48\r
49/* node type bit */\r
50#define NTYPE2BIT(type) (1<<(type))\r
51\r
52#define BIT_NT_STR NTYPE2BIT(NT_STR)\r
53#define BIT_NT_CCLASS NTYPE2BIT(NT_CCLASS)\r
54#define BIT_NT_CTYPE NTYPE2BIT(NT_CTYPE)\r
55#define BIT_NT_CANY NTYPE2BIT(NT_CANY)\r
56#define BIT_NT_BREF NTYPE2BIT(NT_BREF)\r
57#define BIT_NT_QTFR NTYPE2BIT(NT_QTFR)\r
58#define BIT_NT_ENCLOSE NTYPE2BIT(NT_ENCLOSE)\r
59#define BIT_NT_ANCHOR NTYPE2BIT(NT_ANCHOR)\r
60#define BIT_NT_LIST NTYPE2BIT(NT_LIST)\r
61#define BIT_NT_ALT NTYPE2BIT(NT_ALT)\r
62#define BIT_NT_CALL NTYPE2BIT(NT_CALL)\r
63\r
64#define IS_NODE_TYPE_SIMPLE(type) \\r
65 ((NTYPE2BIT(type) & (BIT_NT_STR | BIT_NT_CCLASS | BIT_NT_CTYPE |\\r
66 BIT_NT_CANY | BIT_NT_BREF)) != 0)\r
67\r
68#define NTYPE(node) ((node)->u.base.type)\r
69#define SET_NTYPE(node, ntype) (node)->u.base.type = (ntype)\r
70\r
71#define NSTR(node) (&((node)->u.str))\r
72#define NCCLASS(node) (&((node)->u.cclass))\r
73#define NCTYPE(node) (&((node)->u.ctype))\r
74#define NBREF(node) (&((node)->u.bref))\r
75#define NQTFR(node) (&((node)->u.qtfr))\r
76#define NENCLOSE(node) (&((node)->u.enclose))\r
77#define NANCHOR(node) (&((node)->u.anchor))\r
78#define NCONS(node) (&((node)->u.cons))\r
79#define NCALL(node) (&((node)->u.call))\r
80\r
81#define NCAR(node) (NCONS(node)->car)\r
82#define NCDR(node) (NCONS(node)->cdr)\r
83\r
84\r
85\r
86#define ANCHOR_ANYCHAR_STAR_MASK (ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML)\r
87#define ANCHOR_END_BUF_MASK (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)\r
88\r
89#define ENCLOSE_MEMORY (1<<0)\r
90#define ENCLOSE_OPTION (1<<1)\r
91#define ENCLOSE_STOP_BACKTRACK (1<<2)\r
92\r
93#define NODE_STR_MARGIN 16\r
94#define NODE_STR_BUF_SIZE 24 /* sizeof(CClassNode) - sizeof(int)*4 */\r
95#define NODE_BACKREFS_SIZE 6\r
96\r
97#define NSTR_RAW (1<<0) /* by backslashed number */\r
98#define NSTR_AMBIG (1<<1)\r
99#define NSTR_DONT_GET_OPT_INFO (1<<2)\r
100\r
101#define NSTRING_LEN(node) ((int)((node)->u.str.end - (node)->u.str.s))\r
102#define NSTRING_SET_RAW(node) (node)->u.str.flag |= NSTR_RAW\r
103#define NSTRING_CLEAR_RAW(node) (node)->u.str.flag &= ~NSTR_RAW\r
104#define NSTRING_SET_AMBIG(node) (node)->u.str.flag |= NSTR_AMBIG\r
105#define NSTRING_SET_DONT_GET_OPT_INFO(node) \\r
106 (node)->u.str.flag |= NSTR_DONT_GET_OPT_INFO\r
107#define NSTRING_IS_RAW(node) (((node)->u.str.flag & NSTR_RAW) != 0)\r
108#define NSTRING_IS_AMBIG(node) (((node)->u.str.flag & NSTR_AMBIG) != 0)\r
109#define NSTRING_IS_DONT_GET_OPT_INFO(node) \\r
110 (((node)->u.str.flag & NSTR_DONT_GET_OPT_INFO) != 0)\r
111\r
112#define BACKREFS_P(br) \\r
113 (IS_NOT_NULL((br)->back_dynamic) ? (br)->back_dynamic : (br)->back_static);\r
114\r
115#define NQ_TARGET_ISNOT_EMPTY 0\r
116#define NQ_TARGET_IS_EMPTY 1\r
117#define NQ_TARGET_IS_EMPTY_MEM 2\r
118#define NQ_TARGET_IS_EMPTY_REC 3\r
119\r
120/* status bits */\r
121#define NST_MIN_FIXED (1<<0)\r
122#define NST_MAX_FIXED (1<<1)\r
123#define NST_CLEN_FIXED (1<<2)\r
124#define NST_MARK1 (1<<3)\r
125#define NST_MARK2 (1<<4)\r
126#define NST_MEM_BACKREFED (1<<5)\r
127#define NST_STOP_BT_SIMPLE_REPEAT (1<<6)\r
128#define NST_RECURSION (1<<7)\r
129#define NST_CALLED (1<<8)\r
130#define NST_ADDR_FIXED (1<<9)\r
131#define NST_NAMED_GROUP (1<<10)\r
132#define NST_NAME_REF (1<<11)\r
133#define NST_IN_REPEAT (1<<12) /* STK_REPEAT is nested in stack. */\r
134#define NST_NEST_LEVEL (1<<13)\r
135#define NST_BY_NUMBER (1<<14) /* {n,m} */\r
136\r
137#define SET_ENCLOSE_STATUS(node,f) (node)->u.enclose.state |= (f)\r
138#define CLEAR_ENCLOSE_STATUS(node,f) (node)->u.enclose.state &= ~(f)\r
139\r
140#define IS_ENCLOSE_CALLED(en) (((en)->state & NST_CALLED) != 0)\r
141#define IS_ENCLOSE_ADDR_FIXED(en) (((en)->state & NST_ADDR_FIXED) != 0)\r
142#define IS_ENCLOSE_RECURSION(en) (((en)->state & NST_RECURSION) != 0)\r
143#define IS_ENCLOSE_MARK1(en) (((en)->state & NST_MARK1) != 0)\r
144#define IS_ENCLOSE_MARK2(en) (((en)->state & NST_MARK2) != 0)\r
145#define IS_ENCLOSE_MIN_FIXED(en) (((en)->state & NST_MIN_FIXED) != 0)\r
146#define IS_ENCLOSE_MAX_FIXED(en) (((en)->state & NST_MAX_FIXED) != 0)\r
147#define IS_ENCLOSE_CLEN_FIXED(en) (((en)->state & NST_CLEN_FIXED) != 0)\r
148#define IS_ENCLOSE_STOP_BT_SIMPLE_REPEAT(en) \\r
149 (((en)->state & NST_STOP_BT_SIMPLE_REPEAT) != 0)\r
150#define IS_ENCLOSE_NAMED_GROUP(en) (((en)->state & NST_NAMED_GROUP) != 0)\r
151\r
152#define SET_CALL_RECURSION(node) (node)->u.call.state |= NST_RECURSION\r
153#define IS_CALL_RECURSION(cn) (((cn)->state & NST_RECURSION) != 0)\r
154#define IS_CALL_NAME_REF(cn) (((cn)->state & NST_NAME_REF) != 0)\r
155#define IS_BACKREF_NAME_REF(bn) (((bn)->state & NST_NAME_REF) != 0)\r
156#define IS_BACKREF_NEST_LEVEL(bn) (((bn)->state & NST_NEST_LEVEL) != 0)\r
157#define IS_QUANTIFIER_IN_REPEAT(qn) (((qn)->state & NST_IN_REPEAT) != 0)\r
158#define IS_QUANTIFIER_BY_NUMBER(qn) (((qn)->state & NST_BY_NUMBER) != 0)\r
159\r
160#define CALLNODE_REFNUM_UNDEF -1\r
161\r
162typedef struct {\r
163 NodeBase base;\r
164 UChar* s;\r
165 UChar* end;\r
166 unsigned int flag;\r
167 int capa; /* (allocated size - 1) or 0: use buf[] */\r
168 UChar buf[NODE_STR_BUF_SIZE];\r
169} StrNode;\r
170\r
171typedef struct {\r
172 NodeBase base;\r
173 int state;\r
174 struct _Node* target;\r
175 int lower;\r
176 int upper;\r
177 int greedy;\r
178 int target_empty_info;\r
179 struct _Node* head_exact;\r
180 struct _Node* next_head_exact;\r
181 int is_refered; /* include called node. don't eliminate even if {0} */\r
182#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
183 int comb_exp_check_num; /* 1,2,3...: check, 0: no check */\r
184#endif\r
185} QtfrNode;\r
186\r
187typedef struct {\r
188 NodeBase base;\r
189 int state;\r
190 int type;\r
191 int regnum;\r
192 OnigOptionType option;\r
193 struct _Node* target;\r
194 AbsAddrType call_addr;\r
195 /* for multiple call reference */\r
196 OnigDistance min_len; /* min length (byte) */\r
197 OnigDistance max_len; /* max length (byte) */ \r
198 int char_len; /* character length */\r
199 int opt_count; /* referenced count in optimize_node_left() */\r
200} EncloseNode;\r
201\r
202#ifdef USE_SUBEXP_CALL\r
203\r
204typedef struct {\r
205 int offset;\r
206 struct _Node* target;\r
207} UnsetAddr;\r
208\r
209typedef struct {\r
210 int num;\r
211 int alloc;\r
212 UnsetAddr* us;\r
213} UnsetAddrList;\r
214\r
215typedef struct {\r
216 NodeBase base;\r
217 int state;\r
218 int group_num;\r
219 UChar* name;\r
220 UChar* name_end;\r
221 struct _Node* target; /* EncloseNode : ENCLOSE_MEMORY */\r
222 UnsetAddrList* unset_addr_list;\r
223} CallNode;\r
224\r
225#endif\r
226\r
227typedef struct {\r
228 NodeBase base;\r
229 int state;\r
230 int back_num;\r
231 int back_static[NODE_BACKREFS_SIZE];\r
232 int* back_dynamic;\r
233 int nest_level;\r
234} BRefNode;\r
235\r
236typedef struct {\r
237 NodeBase base;\r
238 int type;\r
239 struct _Node* target;\r
240 int char_len;\r
241} AnchorNode;\r
242\r
243typedef struct {\r
244 NodeBase base;\r
245 struct _Node* car;\r
246 struct _Node* cdr;\r
247} ConsAltNode;\r
248\r
249typedef struct {\r
250 NodeBase base;\r
251 int ctype;\r
252 int not;\r
253} CtypeNode;\r
254\r
255typedef struct _Node {\r
256 union {\r
257 NodeBase base;\r
258 StrNode str;\r
259 CClassNode cclass;\r
260 QtfrNode qtfr;\r
261 EncloseNode enclose;\r
262 BRefNode bref;\r
263 AnchorNode anchor;\r
264 ConsAltNode cons;\r
265 CtypeNode ctype;\r
266#ifdef USE_SUBEXP_CALL\r
267 CallNode call;\r
268#endif\r
269 } u;\r
270} Node;\r
271\r
272\r
273#define NULL_NODE ((Node* )0)\r
274\r
275#define SCANENV_MEMNODES_SIZE 8\r
276#define SCANENV_MEM_NODES(senv) \\r
277 (IS_NOT_NULL((senv)->mem_nodes_dynamic) ? \\r
278 (senv)->mem_nodes_dynamic : (senv)->mem_nodes_static)\r
279\r
280typedef struct {\r
281 OnigOptionType option;\r
282 OnigCaseFoldType case_fold_flag;\r
283 OnigEncoding enc;\r
284 OnigSyntaxType* syntax;\r
285 BitStatusType capture_history;\r
286 BitStatusType bt_mem_start;\r
287 BitStatusType bt_mem_end;\r
288 BitStatusType backrefed_mem;\r
289 UChar* pattern;\r
290 UChar* pattern_end;\r
291 UChar* error;\r
292 UChar* error_end;\r
293 regex_t* reg; /* for reg->names only */\r
294 int num_call;\r
295#ifdef USE_SUBEXP_CALL\r
296 UnsetAddrList* unset_addr_list;\r
297#endif\r
298 int num_mem;\r
299#ifdef USE_NAMED_GROUP\r
300 int num_named;\r
301#endif\r
302 int mem_alloc;\r
303 Node* mem_nodes_static[SCANENV_MEMNODES_SIZE];\r
304 Node** mem_nodes_dynamic;\r
305#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
306 int num_comb_exp_check;\r
307 int comb_exp_max_regnum;\r
308 int curr_max_regnum;\r
309 int has_recursion;\r
310#endif\r
311} ScanEnv;\r
312\r
313\r
314#define IS_SYNTAX_OP(syn, opm) (((syn)->op & (opm)) != 0)\r
315#define IS_SYNTAX_OP2(syn, opm) (((syn)->op2 & (opm)) != 0)\r
316#define IS_SYNTAX_BV(syn, bvm) (((syn)->behavior & (bvm)) != 0)\r
317\r
318#ifdef USE_NAMED_GROUP\r
319typedef struct {\r
320 int new_val;\r
321} GroupNumRemap;\r
322\r
323extern int onig_renumber_name_table P_((regex_t* reg, GroupNumRemap* map));\r
324#endif\r
325\r
326extern int onig_strncmp P_((const UChar* s1, const UChar* s2, int n));\r
327extern void onig_strcpy P_((UChar* dest, const UChar* src, const UChar* end));\r
328extern void onig_scan_env_set_error_string P_((ScanEnv* env, int ecode, UChar* arg, UChar* arg_end));\r
329extern int onig_scan_unsigned_number P_((UChar** src, const UChar* end, OnigEncoding enc));\r
330extern void onig_reduce_nested_quantifier P_((Node* pnode, Node* cnode));\r
331extern void onig_node_conv_to_str_node P_((Node* node, int raw));\r
332extern int onig_node_str_cat P_((Node* node, const UChar* s, const UChar* end));\r
333extern int onig_node_str_set P_((Node* node, const UChar* s, const UChar* end));\r
334extern void onig_node_free P_((Node* node));\r
335extern Node* onig_node_new_enclose P_((int type));\r
336extern Node* onig_node_new_anchor P_((int type));\r
337extern Node* onig_node_new_str P_((const UChar* s, const UChar* end));\r
338extern Node* onig_node_new_list P_((Node* left, Node* right));\r
339extern Node* onig_node_list_add P_((Node* list, Node* x));\r
340extern Node* onig_node_new_alt P_((Node* left, Node* right));\r
341extern void onig_node_str_clear P_((Node* node));\r
342extern int onig_free_node_list P_((void));\r
343extern int onig_names_free P_((regex_t* reg));\r
344extern int onig_parse_make_tree P_((Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env));\r
345extern int onig_free_shared_cclass_table P_((void));\r
346\r
347#ifdef ONIG_DEBUG\r
348#ifdef USE_NAMED_GROUP\r
349extern int onig_print_names(FILE*, regex_t*);\r
350#endif\r
351#endif\r
352\r
353#endif /* REGPARSE_H */\r