]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.h
MdeModulePkg RegularExpressionDxe: Update Oniguruma to 6.9.0
[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
b602265d 7 * Copyright (c) 2002-2018 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
14b0e578 8 * All rights reserved.\r
14b0e578
CS
9 *\r
10 * Redistribution and use in source and binary forms, with or without\r
11 * modification, are permitted provided that the following conditions\r
12 * are met:\r
13 * 1. Redistributions of source code must retain the above copyright\r
14 * notice, this list of conditions and the following disclaimer.\r
15 * 2. Redistributions in binary form must reproduce the above copyright\r
16 * notice, this list of conditions and the following disclaimer in the\r
17 * documentation and/or other materials provided with the distribution.\r
18 *\r
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
29 * SUCH DAMAGE.\r
30 */\r
31\r
32#include "regint.h"\r
33\r
34/* node type */\r
b602265d
DG
35typedef enum {\r
36 NODE_STRING = 0,\r
37 NODE_CCLASS = 1,\r
38 NODE_CTYPE = 2,\r
39 NODE_BACKREF = 3,\r
40 NODE_QUANT = 4,\r
41 NODE_ENCLOSURE = 5,\r
42 NODE_ANCHOR = 6,\r
43 NODE_LIST = 7,\r
44 NODE_ALT = 8,\r
45 NODE_CALL = 9,\r
46 NODE_GIMMICK = 10\r
47} NodeType;\r
48\r
49enum GimmickType {\r
50 GIMMICK_FAIL = 0,\r
51 GIMMICK_KEEP = 1,\r
52 GIMMICK_SAVE = 2,\r
53 GIMMICK_UPDATE_VAR = 3,\r
54#ifdef USE_CALLOUT\r
55 GIMMICK_CALLOUT = 4,\r
56#endif\r
57};\r
58\r
14b0e578
CS
59\r
60/* node type bit */\r
b602265d
DG
61#define NODE_TYPE2BIT(type) (1<<(type))\r
62\r
63#define NODE_BIT_STRING NODE_TYPE2BIT(NODE_STRING)\r
64#define NODE_BIT_CCLASS NODE_TYPE2BIT(NODE_CCLASS)\r
65#define NODE_BIT_CTYPE NODE_TYPE2BIT(NODE_CTYPE)\r
66#define NODE_BIT_BACKREF NODE_TYPE2BIT(NODE_BACKREF)\r
67#define NODE_BIT_QUANT NODE_TYPE2BIT(NODE_QUANT)\r
68#define NODE_BIT_ENCLOSURE NODE_TYPE2BIT(NODE_ENCLOSURE)\r
69#define NODE_BIT_ANCHOR NODE_TYPE2BIT(NODE_ANCHOR)\r
70#define NODE_BIT_LIST NODE_TYPE2BIT(NODE_LIST)\r
71#define NODE_BIT_ALT NODE_TYPE2BIT(NODE_ALT)\r
72#define NODE_BIT_CALL NODE_TYPE2BIT(NODE_CALL)\r
73#define NODE_BIT_GIMMICK NODE_TYPE2BIT(NODE_GIMMICK)\r
74\r
75#define NODE_IS_SIMPLE_TYPE(node) \\r
76 ((NODE_TYPE2BIT(NODE_TYPE(node)) & \\r
77 (NODE_BIT_STRING | NODE_BIT_CCLASS | NODE_BIT_CTYPE | NODE_BIT_BACKREF)) != 0)\r
78\r
79#define NODE_TYPE(node) ((node)->u.base.node_type)\r
80#define NODE_SET_TYPE(node, ntype) (node)->u.base.node_type = (ntype)\r
81\r
82#define STR_(node) (&((node)->u.str))\r
83#define CCLASS_(node) (&((node)->u.cclass))\r
84#define CTYPE_(node) (&((node)->u.ctype))\r
85#define BACKREF_(node) (&((node)->u.backref))\r
86#define QUANT_(node) (&((node)->u.quant))\r
87#define ENCLOSURE_(node) (&((node)->u.enclosure))\r
88#define ANCHOR_(node) (&((node)->u.anchor))\r
89#define CONS_(node) (&((node)->u.cons))\r
90#define CALL_(node) (&((node)->u.call))\r
91#define GIMMICK_(node) (&((node)->u.gimmick))\r
92\r
93#define NODE_CAR(node) (CONS_(node)->car)\r
94#define NODE_CDR(node) (CONS_(node)->cdr)\r
95\r
96#define CTYPE_ANYCHAR -1\r
97#define NODE_IS_ANYCHAR(node) \\r
98 (NODE_TYPE(node) == NODE_CTYPE && CTYPE_(node)->ctype == CTYPE_ANYCHAR)\r
99\r
100#define CTYPE_OPTION(node, reg) \\r
101 (NODE_IS_FIXED_OPTION(node) ? CTYPE_(node)->options : reg->options)\r
102\r
103\r
104#define ANCHOR_ANYCHAR_INF_MASK (ANCHOR_ANYCHAR_INF | ANCHOR_ANYCHAR_INF_ML)\r
14b0e578
CS
105#define ANCHOR_END_BUF_MASK (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)\r
106\r
b602265d
DG
107enum EnclosureType {\r
108 ENCLOSURE_MEMORY = 0,\r
109 ENCLOSURE_OPTION = 1,\r
110 ENCLOSURE_STOP_BACKTRACK = 2,\r
111 ENCLOSURE_IF_ELSE = 3,\r
112};\r
14b0e578 113\r
b602265d
DG
114#define NODE_STRING_MARGIN 16\r
115#define NODE_STRING_BUF_SIZE 24 /* sizeof(CClassNode) - sizeof(int)*4 */\r
14b0e578
CS
116#define NODE_BACKREFS_SIZE 6\r
117\r
b602265d
DG
118#define NODE_STRING_RAW (1<<0) /* by backslashed number */\r
119#define NODE_STRING_AMBIG (1<<1)\r
120#define NODE_STRING_DONT_GET_OPT_INFO (1<<2)\r
121\r
122#define NODE_STRING_LEN(node) (int )((node)->u.str.end - (node)->u.str.s)\r
123#define NODE_STRING_SET_RAW(node) (node)->u.str.flag |= NODE_STRING_RAW\r
124#define NODE_STRING_CLEAR_RAW(node) (node)->u.str.flag &= ~NODE_STRING_RAW\r
125#define NODE_STRING_SET_AMBIG(node) (node)->u.str.flag |= NODE_STRING_AMBIG\r
126#define NODE_STRING_SET_DONT_GET_OPT_INFO(node) \\r
127 (node)->u.str.flag |= NODE_STRING_DONT_GET_OPT_INFO\r
128#define NODE_STRING_IS_RAW(node) \\r
129 (((node)->u.str.flag & NODE_STRING_RAW) != 0)\r
130#define NODE_STRING_IS_AMBIG(node) \\r
131 (((node)->u.str.flag & NODE_STRING_AMBIG) != 0)\r
132#define NODE_STRING_IS_DONT_GET_OPT_INFO(node) \\r
133 (((node)->u.str.flag & NODE_STRING_DONT_GET_OPT_INFO) != 0)\r
14b0e578
CS
134\r
135#define BACKREFS_P(br) \\r
b602265d
DG
136 (IS_NOT_NULL((br)->back_dynamic) ? (br)->back_dynamic : (br)->back_static)\r
137\r
138enum QuantBodyEmpty {\r
139 QUANT_BODY_IS_NOT_EMPTY = 0,\r
140 QUANT_BODY_IS_EMPTY = 1,\r
141 QUANT_BODY_IS_EMPTY_MEM = 2,\r
142 QUANT_BODY_IS_EMPTY_REC = 3\r
143};\r
144\r
145/* node status bits */\r
146#define NODE_ST_MIN_FIXED (1<<0)\r
147#define NODE_ST_MAX_FIXED (1<<1)\r
148#define NODE_ST_CLEN_FIXED (1<<2)\r
149#define NODE_ST_MARK1 (1<<3)\r
150#define NODE_ST_MARK2 (1<<4)\r
151#define NODE_ST_STOP_BT_SIMPLE_REPEAT (1<<5)\r
152#define NODE_ST_RECURSION (1<<6)\r
153#define NODE_ST_CALLED (1<<7)\r
154#define NODE_ST_ADDR_FIXED (1<<8)\r
155#define NODE_ST_NAMED_GROUP (1<<9)\r
156#define NODE_ST_IN_REAL_REPEAT (1<<10) /* STK_REPEAT is nested in stack. */\r
157#define NODE_ST_IN_ZERO_REPEAT (1<<11) /* (....){0} */\r
158#define NODE_ST_IN_MULTI_ENTRY (1<<12)\r
159#define NODE_ST_NEST_LEVEL (1<<13)\r
160#define NODE_ST_BY_NUMBER (1<<14) /* {n,m} */\r
161#define NODE_ST_BY_NAME (1<<15) /* backref by name */\r
162#define NODE_ST_BACKREF (1<<16)\r
163#define NODE_ST_CHECKER (1<<17)\r
164#define NODE_ST_FIXED_OPTION (1<<18)\r
165#define NODE_ST_PROHIBIT_RECURSION (1<<19)\r
166#define NODE_ST_SUPER (1<<20)\r
167\r
168\r
169#define NODE_STATUS(node) (((Node* )node)->u.base.status)\r
170#define NODE_STATUS_ADD(node,f) (NODE_STATUS(node) |= (NODE_ST_ ## f))\r
171#define NODE_STATUS_REMOVE(node,f) (NODE_STATUS(node) &= ~(NODE_ST_ ## f))\r
172\r
173#define NODE_IS_BY_NUMBER(node) ((NODE_STATUS(node) & NODE_ST_BY_NUMBER) != 0)\r
174#define NODE_IS_IN_REAL_REPEAT(node) ((NODE_STATUS(node) & NODE_ST_IN_REAL_REPEAT) != 0)\r
175#define NODE_IS_CALLED(node) ((NODE_STATUS(node) & NODE_ST_CALLED) != 0)\r
176#define NODE_IS_IN_MULTI_ENTRY(node) ((NODE_STATUS(node) & NODE_ST_IN_MULTI_ENTRY) != 0)\r
177#define NODE_IS_RECURSION(node) ((NODE_STATUS(node) & NODE_ST_RECURSION) != 0)\r
178#define NODE_IS_IN_ZERO_REPEAT(node) ((NODE_STATUS(node) & NODE_ST_IN_ZERO_REPEAT) != 0)\r
179#define NODE_IS_NAMED_GROUP(node) ((NODE_STATUS(node) & NODE_ST_NAMED_GROUP) != 0)\r
180#define NODE_IS_ADDR_FIXED(node) ((NODE_STATUS(node) & NODE_ST_ADDR_FIXED) != 0)\r
181#define NODE_IS_CLEN_FIXED(node) ((NODE_STATUS(node) & NODE_ST_CLEN_FIXED) != 0)\r
182#define NODE_IS_MIN_FIXED(node) ((NODE_STATUS(node) & NODE_ST_MIN_FIXED) != 0)\r
183#define NODE_IS_MAX_FIXED(node) ((NODE_STATUS(node) & NODE_ST_MAX_FIXED) != 0)\r
184#define NODE_IS_MARK1(node) ((NODE_STATUS(node) & NODE_ST_MARK1) != 0)\r
185#define NODE_IS_MARK2(node) ((NODE_STATUS(node) & NODE_ST_MARK2) != 0)\r
186#define NODE_IS_NEST_LEVEL(node) ((NODE_STATUS(node) & NODE_ST_NEST_LEVEL) != 0)\r
187#define NODE_IS_BY_NAME(node) ((NODE_STATUS(node) & NODE_ST_BY_NAME) != 0)\r
188#define NODE_IS_BACKREF(node) ((NODE_STATUS(node) & NODE_ST_BACKREF) != 0)\r
189#define NODE_IS_CHECKER(node) ((NODE_STATUS(node) & NODE_ST_CHECKER) != 0)\r
190#define NODE_IS_FIXED_OPTION(node) ((NODE_STATUS(node) & NODE_ST_FIXED_OPTION) != 0)\r
191#define NODE_IS_SUPER(node) ((NODE_STATUS(node) & NODE_ST_SUPER) != 0)\r
192#define NODE_IS_PROHIBIT_RECURSION(node) \\r
193 ((NODE_STATUS(node) & NODE_ST_PROHIBIT_RECURSION) != 0)\r
194#define NODE_IS_STOP_BT_SIMPLE_REPEAT(node) \\r
195 ((NODE_STATUS(node) & NODE_ST_STOP_BT_SIMPLE_REPEAT) != 0)\r
196\r
197#define NODE_BODY(node) ((node)->u.base.body)\r
198#define NODE_QUANT_BODY(node) ((node)->body)\r
199#define NODE_ENCLOSURE_BODY(node) ((node)->body)\r
200#define NODE_CALL_BODY(node) ((node)->body)\r
201#define NODE_ANCHOR_BODY(node) ((node)->body)\r
202\r
14b0e578
CS
203\r
204typedef struct {\r
b602265d
DG
205 NodeType node_type;\r
206 int status;\r
207\r
14b0e578
CS
208 UChar* s;\r
209 UChar* end;\r
210 unsigned int flag;\r
211 int capa; /* (allocated size - 1) or 0: use buf[] */\r
b602265d 212 UChar buf[NODE_STRING_BUF_SIZE];\r
14b0e578
CS
213} StrNode;\r
214\r
215typedef struct {\r
b602265d
DG
216 NodeType node_type;\r
217 int status;\r
218\r
219 unsigned int flags;\r
220 BitSet bs;\r
221 BBuf* mbuf; /* multi-byte info or NULL */\r
222} CClassNode;\r
223\r
224typedef struct {\r
225 NodeType node_type;\r
226 int status;\r
227 struct _Node* body;\r
228\r
14b0e578
CS
229 int lower;\r
230 int upper;\r
231 int greedy;\r
b602265d 232 enum QuantBodyEmpty body_empty_info;\r
14b0e578
CS
233 struct _Node* head_exact;\r
234 struct _Node* next_head_exact;\r
235 int is_refered; /* include called node. don't eliminate even if {0} */\r
b602265d 236} QuantNode;\r
14b0e578
CS
237\r
238typedef struct {\r
b602265d
DG
239 NodeType node_type;\r
240 int status;\r
241 struct _Node* body;\r
242\r
243 enum EnclosureType type;\r
244 union {\r
245 struct {\r
246 int regnum;\r
247 AbsAddrType called_addr;\r
248 int entry_count;\r
249 int called_state;\r
250 } m;\r
251 struct {\r
252 OnigOptionType options;\r
253 } o;\r
254 struct {\r
255 /* body is condition */\r
256 struct _Node* Then;\r
257 struct _Node* Else;\r
258 } te;\r
259 };\r
14b0e578 260 /* for multiple call reference */\r
b602265d
DG
261 OnigLen min_len; /* min length (byte) */\r
262 OnigLen max_len; /* max length (byte) */\r
263 int char_len; /* character length */\r
264 int opt_count; /* referenced count in optimize_nodes() */\r
265} EnclosureNode;\r
14b0e578 266\r
b602265d 267#ifdef USE_CALL\r
14b0e578
CS
268\r
269typedef struct {\r
270 int offset;\r
271 struct _Node* target;\r
272} UnsetAddr;\r
273\r
274typedef struct {\r
275 int num;\r
276 int alloc;\r
277 UnsetAddr* us;\r
278} UnsetAddrList;\r
279\r
280typedef struct {\r
b602265d
DG
281 NodeType node_type;\r
282 int status;\r
283 struct _Node* body; /* to EnclosureNode : ENCLOSURE_MEMORY */\r
284\r
285 int by_number;\r
14b0e578
CS
286 int group_num;\r
287 UChar* name;\r
288 UChar* name_end;\r
b602265d 289 int entry_count;\r
14b0e578
CS
290} CallNode;\r
291\r
292#endif\r
293\r
294typedef struct {\r
b602265d
DG
295 NodeType node_type;\r
296 int status;\r
297\r
14b0e578
CS
298 int back_num;\r
299 int back_static[NODE_BACKREFS_SIZE];\r
300 int* back_dynamic;\r
301 int nest_level;\r
b602265d 302} BackRefNode;\r
14b0e578
CS
303\r
304typedef struct {\r
b602265d
DG
305 NodeType node_type;\r
306 int status;\r
307 struct _Node* body;\r
308\r
14b0e578 309 int type;\r
14b0e578 310 int char_len;\r
b602265d 311 int ascii_mode;\r
14b0e578
CS
312} AnchorNode;\r
313\r
314typedef struct {\r
b602265d
DG
315 NodeType node_type;\r
316 int status;\r
317\r
14b0e578
CS
318 struct _Node* car;\r
319 struct _Node* cdr;\r
320} ConsAltNode;\r
321\r
322typedef struct {\r
b602265d
DG
323 NodeType node_type;\r
324 int status;\r
325\r
14b0e578
CS
326 int ctype;\r
327 int not;\r
b602265d
DG
328 OnigOptionType options;\r
329 int ascii_mode;\r
14b0e578
CS
330} CtypeNode;\r
331\r
b602265d
DG
332typedef struct {\r
333 NodeType node_type;\r
334 int status;\r
335\r
336 enum GimmickType type;\r
337 int detail_type;\r
338 int num;\r
339 int id;\r
340} GimmickNode;\r
341\r
14b0e578
CS
342typedef struct _Node {\r
343 union {\r
b602265d
DG
344 struct {\r
345 NodeType node_type;\r
346 int status;\r
347 struct _Node* body;\r
348 } base;\r
349\r
350 StrNode str;\r
351 CClassNode cclass;\r
352 QuantNode quant;\r
353 EnclosureNode enclosure;\r
354 BackRefNode backref;\r
355 AnchorNode anchor;\r
356 ConsAltNode cons;\r
357 CtypeNode ctype;\r
358#ifdef USE_CALL\r
359 CallNode call;\r
14b0e578 360#endif\r
b602265d 361 GimmickNode gimmick;\r
14b0e578
CS
362 } u;\r
363} Node;\r
364\r
365\r
366#define NULL_NODE ((Node* )0)\r
367\r
b602265d
DG
368#define SCANENV_MEMENV_SIZE 8\r
369#define SCANENV_MEMENV(senv) \\r
370 (IS_NOT_NULL((senv)->mem_env_dynamic) ? \\r
371 (senv)->mem_env_dynamic : (senv)->mem_env_static)\r
372\r
373typedef struct {\r
374 Node* node;\r
375#if 0\r
376 int in;\r
377 int recursion;\r
378#endif\r
379} MemEnv;\r
380\r
381typedef struct {\r
382 enum SaveType type;\r
383} SaveItem;\r
14b0e578
CS
384\r
385typedef struct {\r
b602265d 386 OnigOptionType options;\r
14b0e578
CS
387 OnigCaseFoldType case_fold_flag;\r
388 OnigEncoding enc;\r
389 OnigSyntaxType* syntax;\r
b602265d
DG
390 MemStatusType capture_history;\r
391 MemStatusType bt_mem_start;\r
392 MemStatusType bt_mem_end;\r
393 MemStatusType backrefed_mem;\r
14b0e578
CS
394 UChar* pattern;\r
395 UChar* pattern_end;\r
396 UChar* error;\r
397 UChar* error_end;\r
398 regex_t* reg; /* for reg->names only */\r
399 int num_call;\r
b602265d 400#ifdef USE_CALL\r
14b0e578 401 UnsetAddrList* unset_addr_list;\r
b602265d 402 int has_call_zero;\r
14b0e578
CS
403#endif\r
404 int num_mem;\r
14b0e578 405 int num_named;\r
14b0e578 406 int mem_alloc;\r
b602265d
DG
407 MemEnv mem_env_static[SCANENV_MEMENV_SIZE];\r
408 MemEnv* mem_env_dynamic;\r
409 unsigned int parse_depth;\r
410\r
411 int keep_num;\r
412 int save_num;\r
413 int save_alloc_num;\r
414 SaveItem* saves;\r
14b0e578
CS
415} ScanEnv;\r
416\r
417\r
418#define IS_SYNTAX_OP(syn, opm) (((syn)->op & (opm)) != 0)\r
419#define IS_SYNTAX_OP2(syn, opm) (((syn)->op2 & (opm)) != 0)\r
420#define IS_SYNTAX_BV(syn, bvm) (((syn)->behavior & (bvm)) != 0)\r
421\r
14b0e578
CS
422typedef struct {\r
423 int new_val;\r
424} GroupNumRemap;\r
425\r
426extern int onig_renumber_name_table P_((regex_t* reg, GroupNumRemap* map));\r
14b0e578
CS
427\r
428extern int onig_strncmp P_((const UChar* s1, const UChar* s2, int n));\r
429extern void onig_strcpy P_((UChar* dest, const UChar* src, const UChar* end));\r
430extern void onig_scan_env_set_error_string P_((ScanEnv* env, int ecode, UChar* arg, UChar* arg_end));\r
431extern int onig_scan_unsigned_number P_((UChar** src, const UChar* end, OnigEncoding enc));\r
432extern void onig_reduce_nested_quantifier P_((Node* pnode, Node* cnode));\r
433extern void onig_node_conv_to_str_node P_((Node* node, int raw));\r
434extern int onig_node_str_cat P_((Node* node, const UChar* s, const UChar* end));\r
435extern int onig_node_str_set P_((Node* node, const UChar* s, const UChar* end));\r
436extern void onig_node_free P_((Node* node));\r
b602265d
DG
437extern Node* onig_node_new_enclosure P_((int type));\r
438extern Node* onig_node_new_anchor P_((int type, int ascii_mode));\r
14b0e578
CS
439extern Node* onig_node_new_str P_((const UChar* s, const UChar* end));\r
440extern Node* onig_node_new_list P_((Node* left, Node* right));\r
441extern Node* onig_node_list_add P_((Node* list, Node* x));\r
442extern Node* onig_node_new_alt P_((Node* left, Node* right));\r
443extern void onig_node_str_clear P_((Node* node));\r
14b0e578 444extern int onig_names_free P_((regex_t* reg));\r
b602265d 445extern int onig_parse_tree P_((Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env));\r
14b0e578 446extern int onig_free_shared_cclass_table P_((void));\r
b602265d
DG
447extern int onig_is_code_in_cc P_((OnigEncoding enc, OnigCodePoint code, CClassNode* cc));\r
448extern OnigLen onig_get_tiny_min_len(Node* node, unsigned int inhibit_node_types, int* invalid_node);\r
449\r
450#ifdef USE_CALLOUT\r
451extern int onig_global_callout_names_free(void);\r
452#endif\r
14b0e578
CS
453\r
454#ifdef ONIG_DEBUG\r
14b0e578
CS
455extern int onig_print_names(FILE*, regex_t*);\r
456#endif\r
14b0e578
CS
457\r
458#endif /* REGPARSE_H */\r