]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regerror.c
MdeModulePkg RegularExpressionDxe: Update Oniguruma from v6.9.0 to v6.9.3
[mirror_edk2.git] / MdeModulePkg / Universal / RegularExpressionDxe / Oniguruma / regerror.c
CommitLineData
14b0e578
CS
1/**********************************************************************\r
2 regerror.c - Oniguruma (regular expression library)\r
3**********************************************************************/\r
4/*-\r
b26691c4 5 * Copyright (c) 2002-2019 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
14b0e578
CS
6 * All rights reserved.\r
7 *\r
14b0e578
CS
8 * Redistribution and use in source and binary forms, with or without\r
9 * modification, are permitted provided that the following conditions\r
10 * are met:\r
11 * 1. Redistributions of source code must retain the above copyright\r
12 * notice, this list of conditions and the following disclaimer.\r
13 * 2. Redistributions in binary form must reproduce the above copyright\r
14 * notice, this list of conditions and the following disclaimer in the\r
15 * documentation and/or other materials provided with the distribution.\r
16 *\r
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
27 * SUCH DAMAGE.\r
28 */\r
29\r
14b0e578 30#include "regint.h"\r
14b0e578
CS
31#if 0\r
32#include <stdio.h> /* for vsnprintf() */\r
33\r
14b0e578 34#include <stdarg.h>\r
14b0e578
CS
35#endif\r
36\r
37extern UChar*\r
38onig_error_code_to_format(int code)\r
39{\r
40 char *p;\r
41\r
14b0e578
CS
42 switch (code) {\r
43 case ONIG_MISMATCH:\r
44 p = "mismatch"; break;\r
45 case ONIG_NO_SUPPORT_CONFIG:\r
46 p = "no support in this configuration"; break;\r
b602265d
DG
47 case ONIG_ABORT:\r
48 p = "abort"; break;\r
14b0e578
CS
49 case ONIGERR_MEMORY:\r
50 p = "fail to memory allocation"; break;\r
51 case ONIGERR_MATCH_STACK_LIMIT_OVER:\r
52 p = "match-stack limit over"; break;\r
b602265d
DG
53 case ONIGERR_PARSE_DEPTH_LIMIT_OVER:\r
54 p = "parse depth limit over"; break;\r
55 case ONIGERR_RETRY_LIMIT_IN_MATCH_OVER:\r
56 p = "retry-limit-in-match over"; break;\r
14b0e578
CS
57 case ONIGERR_TYPE_BUG:\r
58 p = "undefined type (bug)"; break;\r
59 case ONIGERR_PARSER_BUG:\r
60 p = "internal parser error (bug)"; break;\r
61 case ONIGERR_STACK_BUG:\r
62 p = "stack error (bug)"; break;\r
63 case ONIGERR_UNDEFINED_BYTECODE:\r
64 p = "undefined bytecode (bug)"; break;\r
65 case ONIGERR_UNEXPECTED_BYTECODE:\r
66 p = "unexpected bytecode (bug)"; break;\r
67 case ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED:\r
68 p = "default multibyte-encoding is not setted"; break;\r
69 case ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:\r
70 p = "can't convert to wide-char on specified multibyte-encoding"; break;\r
b602265d
DG
71 case ONIGERR_FAIL_TO_INITIALIZE:\r
72 p = "fail to initialize"; break;\r
14b0e578
CS
73 case ONIGERR_INVALID_ARGUMENT:\r
74 p = "invalid argument"; break;\r
75 case ONIGERR_END_PATTERN_AT_LEFT_BRACE:\r
76 p = "end pattern at left brace"; break;\r
77 case ONIGERR_END_PATTERN_AT_LEFT_BRACKET:\r
78 p = "end pattern at left bracket"; break;\r
79 case ONIGERR_EMPTY_CHAR_CLASS:\r
80 p = "empty char-class"; break;\r
81 case ONIGERR_PREMATURE_END_OF_CHAR_CLASS:\r
82 p = "premature end of char-class"; break;\r
83 case ONIGERR_END_PATTERN_AT_ESCAPE:\r
84 p = "end pattern at escape"; break;\r
85 case ONIGERR_END_PATTERN_AT_META:\r
86 p = "end pattern at meta"; break;\r
87 case ONIGERR_END_PATTERN_AT_CONTROL:\r
88 p = "end pattern at control"; break;\r
89 case ONIGERR_META_CODE_SYNTAX:\r
90 p = "invalid meta-code syntax"; break;\r
91 case ONIGERR_CONTROL_CODE_SYNTAX:\r
92 p = "invalid control-code syntax"; break;\r
93 case ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:\r
94 p = "char-class value at end of range"; break;\r
95 case ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:\r
96 p = "char-class value at start of range"; break;\r
97 case ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:\r
98 p = "unmatched range specifier in char-class"; break;\r
99 case ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:\r
100 p = "target of repeat operator is not specified"; break;\r
101 case ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:\r
102 p = "target of repeat operator is invalid"; break;\r
103 case ONIGERR_NESTED_REPEAT_OPERATOR:\r
104 p = "nested repeat operator"; break;\r
105 case ONIGERR_UNMATCHED_CLOSE_PARENTHESIS:\r
106 p = "unmatched close parenthesis"; break;\r
107 case ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:\r
108 p = "end pattern with unmatched parenthesis"; break;\r
109 case ONIGERR_END_PATTERN_IN_GROUP:\r
110 p = "end pattern in group"; break;\r
111 case ONIGERR_UNDEFINED_GROUP_OPTION:\r
112 p = "undefined group option"; break;\r
113 case ONIGERR_INVALID_POSIX_BRACKET_TYPE:\r
114 p = "invalid POSIX bracket type"; break;\r
115 case ONIGERR_INVALID_LOOK_BEHIND_PATTERN:\r
116 p = "invalid pattern in look-behind"; break;\r
117 case ONIGERR_INVALID_REPEAT_RANGE_PATTERN:\r
118 p = "invalid repeat range {lower,upper}"; break;\r
119 case ONIGERR_TOO_BIG_NUMBER:\r
120 p = "too big number"; break;\r
121 case ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:\r
122 p = "too big number for repeat range"; break;\r
123 case ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:\r
124 p = "upper is smaller than lower in repeat range"; break;\r
125 case ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS:\r
126 p = "empty range in char class"; break;\r
127 case ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:\r
128 p = "mismatch multibyte code length in char-class range"; break;\r
129 case ONIGERR_TOO_MANY_MULTI_BYTE_RANGES:\r
130 p = "too many multibyte code ranges are specified"; break;\r
131 case ONIGERR_TOO_SHORT_MULTI_BYTE_STRING:\r
132 p = "too short multibyte code string"; break;\r
133 case ONIGERR_TOO_BIG_BACKREF_NUMBER:\r
134 p = "too big backref number"; break;\r
135 case ONIGERR_INVALID_BACKREF:\r
14b0e578 136 p = "invalid backref number/name"; break;\r
14b0e578
CS
137 case ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED:\r
138 p = "numbered backref/call is not allowed. (use name)"; break;\r
b602265d
DG
139 case ONIGERR_TOO_MANY_CAPTURES:\r
140 p = "too many captures"; break;\r
14b0e578
CS
141 case ONIGERR_TOO_BIG_WIDE_CHAR_VALUE:\r
142 p = "too big wide-char value"; break;\r
143 case ONIGERR_TOO_LONG_WIDE_CHAR_VALUE:\r
144 p = "too long wide-char value"; break;\r
145 case ONIGERR_INVALID_CODE_POINT_VALUE:\r
146 p = "invalid code point value"; break;\r
147 case ONIGERR_EMPTY_GROUP_NAME:\r
148 p = "group name is empty"; break;\r
149 case ONIGERR_INVALID_GROUP_NAME:\r
150 p = "invalid group name <%n>"; break;\r
151 case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\r
14b0e578 152 p = "invalid char in group name <%n>"; break;\r
14b0e578
CS
153 case ONIGERR_UNDEFINED_NAME_REFERENCE:\r
154 p = "undefined name <%n> reference"; break;\r
155 case ONIGERR_UNDEFINED_GROUP_REFERENCE:\r
156 p = "undefined group <%n> reference"; break;\r
157 case ONIGERR_MULTIPLEX_DEFINED_NAME:\r
158 p = "multiplex defined name <%n>"; break;\r
159 case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\r
160 p = "multiplex definition name <%n> call"; break;\r
161 case ONIGERR_NEVER_ENDING_RECURSION:\r
162 p = "never ending recursion"; break;\r
163 case ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY:\r
164 p = "group number is too big for capture history"; break;\r
165 case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\r
166 p = "invalid character property name {%n}"; break;\r
b602265d
DG
167 case ONIGERR_INVALID_IF_ELSE_SYNTAX:\r
168 p = "invalid if-else syntax"; break;\r
169 case ONIGERR_INVALID_ABSENT_GROUP_PATTERN:\r
170 p = "invalid absent group pattern"; break;\r
171 case ONIGERR_INVALID_ABSENT_GROUP_GENERATOR_PATTERN:\r
172 p = "invalid absent group generator pattern"; break;\r
173 case ONIGERR_INVALID_CALLOUT_PATTERN:\r
174 p = "invalid callout pattern"; break;\r
175 case ONIGERR_INVALID_CALLOUT_NAME:\r
176 p = "invalid callout name"; break;\r
177 case ONIGERR_UNDEFINED_CALLOUT_NAME:\r
178 p = "undefined callout name"; break;\r
179 case ONIGERR_INVALID_CALLOUT_BODY:\r
180 p = "invalid callout body"; break;\r
181 case ONIGERR_INVALID_CALLOUT_TAG_NAME:\r
182 p = "invalid callout tag name"; break;\r
183 case ONIGERR_INVALID_CALLOUT_ARG:\r
184 p = "invalid callout arg"; break;\r
14b0e578
CS
185 case ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION:\r
186 p = "not supported encoding combination"; break;\r
187 case ONIGERR_INVALID_COMBINATION_OF_OPTIONS:\r
188 p = "invalid combination of options"; break;\r
b602265d
DG
189 case ONIGERR_LIBRARY_IS_NOT_INITIALIZED:\r
190 p = "library is not initialized"; break;\r
14b0e578
CS
191\r
192 default:\r
193 p = "undefined error code"; break;\r
194 }\r
195\r
196 return (UChar* )p;\r
197}\r
198\r
199static void sprint_byte(char* s, unsigned int v)\r
200{\r
61e078dd 201 sprintf_s(s, sizeof("00"), "%02x", (v & 0377));\r
14b0e578
CS
202}\r
203\r
204static void sprint_byte_with_x(char* s, unsigned int v)\r
205{\r
61e078dd 206 sprintf_s(s, sizeof("\\x00"), "\\x%02x", (v & 0377));\r
14b0e578
CS
207}\r
208\r
209static int to_ascii(OnigEncoding enc, UChar *s, UChar *end,\r
b26691c4 210 UChar buf[], int buf_size, int *is_over)\r
14b0e578
CS
211{\r
212 int len;\r
213 UChar *p;\r
214 OnigCodePoint code;\r
215\r
b26691c4
LG
216 if (!s) {\r
217 len = 0;\r
218 *is_over = 0;\r
219 }\r
220 else if (ONIGENC_MBC_MINLEN(enc) > 1) {\r
14b0e578
CS
221 p = s;\r
222 len = 0;\r
223 while (p < end) {\r
224 code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
225 if (code >= 0x80) {\r
b602265d
DG
226 if (code > 0xffff && len + 10 <= buf_size) {\r
227 sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 24));\r
228 sprint_byte((char*)(&(buf[len+4])), (unsigned int)(code >> 16));\r
229 sprint_byte((char*)(&(buf[len+6])), (unsigned int)(code >> 8));\r
230 sprint_byte((char*)(&(buf[len+8])), (unsigned int)code);\r
231 len += 10;\r
232 }\r
233 else if (len + 6 <= buf_size) {\r
234 sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 8));\r
235 sprint_byte((char*)(&(buf[len+4])), (unsigned int)code);\r
236 len += 6;\r
237 }\r
238 else {\r
239 break;\r
240 }\r
14b0e578
CS
241 }\r
242 else {\r
b602265d 243 buf[len++] = (UChar )code;\r
14b0e578
CS
244 }\r
245\r
246 p += enclen(enc, p);\r
247 if (len >= buf_size) break;\r
248 }\r
249\r
b26691c4 250 *is_over = p < end;\r
14b0e578
CS
251 }\r
252 else {\r
b602265d 253 len = MIN((int )(end - s), buf_size);\r
14b0e578
CS
254 xmemcpy(buf, s, (size_t )len);\r
255 *is_over = ((buf_size < (end - s)) ? 1 : 0);\r
256 }\r
257\r
258 return len;\r
259}\r
260\r
261\r
b26691c4
LG
262extern int\r
263onig_is_error_code_needs_param(int code)\r
264{\r
265 switch (code) {\r
266 case ONIGERR_UNDEFINED_NAME_REFERENCE:\r
267 case ONIGERR_UNDEFINED_GROUP_REFERENCE:\r
268 case ONIGERR_MULTIPLEX_DEFINED_NAME:\r
269 case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\r
270 case ONIGERR_INVALID_GROUP_NAME:\r
271 case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\r
272 case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\r
273 return 1;\r
274 default:\r
275 return 0;\r
276 }\r
277}\r
278\r
14b0e578
CS
279/* for ONIG_MAX_ERROR_MESSAGE_LEN */\r
280#define MAX_ERROR_PAR_LEN 30\r
281\r
b26691c4 282extern int EFIAPI onig_error_code_to_str(UChar* s, int code, ...)\r
14b0e578
CS
283{\r
284 UChar *p, *q;\r
285 OnigErrorInfo* einfo;\r
286 int len, is_over;\r
287 UChar parbuf[MAX_ERROR_PAR_LEN];\r
288 va_list vargs;\r
289\r
290 va_init_list(vargs, code);\r
291\r
292 switch (code) {\r
293 case ONIGERR_UNDEFINED_NAME_REFERENCE:\r
294 case ONIGERR_UNDEFINED_GROUP_REFERENCE:\r
295 case ONIGERR_MULTIPLEX_DEFINED_NAME:\r
296 case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\r
297 case ONIGERR_INVALID_GROUP_NAME:\r
298 case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\r
299 case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\r
300 einfo = va_arg(vargs, OnigErrorInfo*);\r
301 len = to_ascii(einfo->enc, einfo->par, einfo->par_end,\r
b602265d 302 parbuf, MAX_ERROR_PAR_LEN - 3, &is_over);\r
14b0e578
CS
303 q = onig_error_code_to_format(code);\r
304 p = s;\r
305 while (*q != '\0') {\r
306 if (*q == '%') {\r
b602265d
DG
307 q++;\r
308 if (*q == 'n') { /* '%n': name */\r
309 xmemcpy(p, parbuf, len);\r
310 p += len;\r
311 if (is_over != 0) {\r
312 xmemcpy(p, "...", 3);\r
313 p += 3;\r
314 }\r
315 q++;\r
316 }\r
317 else\r
318 goto normal_char;\r
14b0e578
CS
319 }\r
320 else {\r
321 normal_char:\r
b602265d 322 *p++ = *q++;\r
14b0e578
CS
323 }\r
324 }\r
325 *p = '\0';\r
b602265d 326 len = (int )(p - s);\r
14b0e578
CS
327 break;\r
328\r
329 default:\r
330 q = onig_error_code_to_format(code);\r
331 len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, q);\r
332 xmemcpy(s, q, len);\r
333 s[len] = '\0';\r
334 break;\r
335 }\r
336\r
337 va_end(vargs);\r
338 return len;\r
339}\r
340\r
341\r
b26691c4
LG
342void EFIAPI onig_snprintf_with_pattern(UChar buf[], int bufsize, OnigEncoding enc,\r
343 UChar* pat, UChar* pat_end, const UChar *fmt, ...)\r
14b0e578
CS
344{\r
345 int n, need, len;\r
346 UChar *p, *s, *bp;\r
347 UChar bs[6];\r
348 va_list args;\r
349\r
350 va_init_list(args, fmt);\r
351 n = xvsnprintf((char* )buf, bufsize, (const char* )fmt, args);\r
352 va_end(args);\r
353\r
b602265d 354 need = (int )(pat_end - pat) * 4 + 4;\r
14b0e578
CS
355\r
356 if (n + need < bufsize) {\r
357 strcat_s((char* )buf, bufsize, ": /");\r
358 s = buf + onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, buf);\r
359\r
360 p = pat;\r
361 while (p < pat_end) {\r
b602265d 362 if (ONIGENC_IS_MBC_HEAD(enc, p)) {\r
14b0e578
CS
363 len = enclen(enc, p);\r
364 if (ONIGENC_MBC_MINLEN(enc) == 1) {\r
365 while (len-- > 0) *s++ = *p++;\r
366 }\r
b602265d 367 else { /* for UTF16/32 */\r
14b0e578
CS
368 int blen;\r
369\r
370 while (len-- > 0) {\r
b602265d 371 sprint_byte_with_x((char* )bs, (unsigned int )(*p++));\r
14b0e578
CS
372 blen = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\r
373 bp = bs;\r
374 while (blen-- > 0) *s++ = *bp++;\r
375 }\r
376 }\r
377 }\r
b602265d
DG
378 else if (*p == '\\') {\r
379 *s++ = *p++;\r
380 len = enclen(enc, p);\r
381 while (len-- > 0) *s++ = *p++;\r
382 }\r
383 else if (*p == '/') {\r
384 *s++ = (unsigned char )'\\';\r
385 *s++ = *p++;\r
386 }\r
14b0e578 387 else if (!ONIGENC_IS_CODE_PRINT(enc, *p) &&\r
b602265d
DG
388 !ONIGENC_IS_CODE_SPACE(enc, *p)) {\r
389 sprint_byte_with_x((char* )bs, (unsigned int )(*p++));\r
390 len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\r
14b0e578 391 bp = bs;\r
b602265d 392 while (len-- > 0) *s++ = *bp++;\r
14b0e578
CS
393 }\r
394 else {\r
b602265d 395 *s++ = *p++;\r
14b0e578
CS
396 }\r
397 }\r
398\r
399 *s++ = '/';\r
400 *s = '\0';\r
401 }\r
402}\r