]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regerror.c
MdeModulePkg: Delete useless case code
[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
5 * Copyright (c) 2002-2007 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
6 * All rights reserved.\r
7 *\r
0af8e57c 8 * (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\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#define HAVE_STDARG_PROTOTYPES\r
33\r
34#include "regint.h"\r
35\r
36#if 0\r
37#include <stdio.h> /* for vsnprintf() */\r
38\r
39#ifdef HAVE_STDARG_PROTOTYPES\r
40#include <stdarg.h>\r
41#define va_init_list(a,b) va_start(a,b)\r
42#else\r
43#include <varargs.h>\r
44#define va_init_list(a,b) va_start(a)\r
45#endif\r
46#endif\r
47\r
48extern UChar*\r
49onig_error_code_to_format(int code)\r
50{\r
51 char *p;\r
52\r
53 if (code >= 0) return (UChar* )0;\r
54\r
55 switch (code) {\r
56 case ONIG_MISMATCH:\r
57 p = "mismatch"; break;\r
58 case ONIG_NO_SUPPORT_CONFIG:\r
59 p = "no support in this configuration"; break;\r
60 case ONIGERR_MEMORY:\r
61 p = "fail to memory allocation"; break;\r
62 case ONIGERR_MATCH_STACK_LIMIT_OVER:\r
63 p = "match-stack limit over"; break;\r
64 case ONIGERR_TYPE_BUG:\r
65 p = "undefined type (bug)"; break;\r
66 case ONIGERR_PARSER_BUG:\r
67 p = "internal parser error (bug)"; break;\r
68 case ONIGERR_STACK_BUG:\r
69 p = "stack error (bug)"; break;\r
70 case ONIGERR_UNDEFINED_BYTECODE:\r
71 p = "undefined bytecode (bug)"; break;\r
72 case ONIGERR_UNEXPECTED_BYTECODE:\r
73 p = "unexpected bytecode (bug)"; break;\r
74 case ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED:\r
75 p = "default multibyte-encoding is not setted"; break;\r
76 case ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:\r
77 p = "can't convert to wide-char on specified multibyte-encoding"; break;\r
78 case ONIGERR_INVALID_ARGUMENT:\r
79 p = "invalid argument"; break;\r
80 case ONIGERR_END_PATTERN_AT_LEFT_BRACE:\r
81 p = "end pattern at left brace"; break;\r
82 case ONIGERR_END_PATTERN_AT_LEFT_BRACKET:\r
83 p = "end pattern at left bracket"; break;\r
84 case ONIGERR_EMPTY_CHAR_CLASS:\r
85 p = "empty char-class"; break;\r
86 case ONIGERR_PREMATURE_END_OF_CHAR_CLASS:\r
87 p = "premature end of char-class"; break;\r
88 case ONIGERR_END_PATTERN_AT_ESCAPE:\r
89 p = "end pattern at escape"; break;\r
90 case ONIGERR_END_PATTERN_AT_META:\r
91 p = "end pattern at meta"; break;\r
92 case ONIGERR_END_PATTERN_AT_CONTROL:\r
93 p = "end pattern at control"; break;\r
94 case ONIGERR_META_CODE_SYNTAX:\r
95 p = "invalid meta-code syntax"; break;\r
96 case ONIGERR_CONTROL_CODE_SYNTAX:\r
97 p = "invalid control-code syntax"; break;\r
98 case ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:\r
99 p = "char-class value at end of range"; break;\r
100 case ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:\r
101 p = "char-class value at start of range"; break;\r
102 case ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:\r
103 p = "unmatched range specifier in char-class"; break;\r
104 case ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:\r
105 p = "target of repeat operator is not specified"; break;\r
106 case ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:\r
107 p = "target of repeat operator is invalid"; break;\r
108 case ONIGERR_NESTED_REPEAT_OPERATOR:\r
109 p = "nested repeat operator"; break;\r
110 case ONIGERR_UNMATCHED_CLOSE_PARENTHESIS:\r
111 p = "unmatched close parenthesis"; break;\r
112 case ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:\r
113 p = "end pattern with unmatched parenthesis"; break;\r
114 case ONIGERR_END_PATTERN_IN_GROUP:\r
115 p = "end pattern in group"; break;\r
116 case ONIGERR_UNDEFINED_GROUP_OPTION:\r
117 p = "undefined group option"; break;\r
118 case ONIGERR_INVALID_POSIX_BRACKET_TYPE:\r
119 p = "invalid POSIX bracket type"; break;\r
120 case ONIGERR_INVALID_LOOK_BEHIND_PATTERN:\r
121 p = "invalid pattern in look-behind"; break;\r
122 case ONIGERR_INVALID_REPEAT_RANGE_PATTERN:\r
123 p = "invalid repeat range {lower,upper}"; break;\r
124 case ONIGERR_TOO_BIG_NUMBER:\r
125 p = "too big number"; break;\r
126 case ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:\r
127 p = "too big number for repeat range"; break;\r
128 case ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:\r
129 p = "upper is smaller than lower in repeat range"; break;\r
130 case ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS:\r
131 p = "empty range in char class"; break;\r
132 case ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:\r
133 p = "mismatch multibyte code length in char-class range"; break;\r
134 case ONIGERR_TOO_MANY_MULTI_BYTE_RANGES:\r
135 p = "too many multibyte code ranges are specified"; break;\r
136 case ONIGERR_TOO_SHORT_MULTI_BYTE_STRING:\r
137 p = "too short multibyte code string"; break;\r
138 case ONIGERR_TOO_BIG_BACKREF_NUMBER:\r
139 p = "too big backref number"; break;\r
140 case ONIGERR_INVALID_BACKREF:\r
141#ifdef USE_NAMED_GROUP\r
142 p = "invalid backref number/name"; break;\r
143#else\r
144 p = "invalid backref number"; break;\r
145#endif\r
146 case ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED:\r
147 p = "numbered backref/call is not allowed. (use name)"; break;\r
148 case ONIGERR_TOO_BIG_WIDE_CHAR_VALUE:\r
149 p = "too big wide-char value"; break;\r
150 case ONIGERR_TOO_LONG_WIDE_CHAR_VALUE:\r
151 p = "too long wide-char value"; break;\r
152 case ONIGERR_INVALID_CODE_POINT_VALUE:\r
153 p = "invalid code point value"; break;\r
154 case ONIGERR_EMPTY_GROUP_NAME:\r
155 p = "group name is empty"; break;\r
156 case ONIGERR_INVALID_GROUP_NAME:\r
157 p = "invalid group name <%n>"; break;\r
158 case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\r
159#ifdef USE_NAMED_GROUP\r
160 p = "invalid char in group name <%n>"; break;\r
161#else\r
162 p = "invalid char in group number <%n>"; break;\r
163#endif\r
164 case ONIGERR_UNDEFINED_NAME_REFERENCE:\r
165 p = "undefined name <%n> reference"; break;\r
166 case ONIGERR_UNDEFINED_GROUP_REFERENCE:\r
167 p = "undefined group <%n> reference"; break;\r
168 case ONIGERR_MULTIPLEX_DEFINED_NAME:\r
169 p = "multiplex defined name <%n>"; break;\r
170 case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\r
171 p = "multiplex definition name <%n> call"; break;\r
172 case ONIGERR_NEVER_ENDING_RECURSION:\r
173 p = "never ending recursion"; break;\r
174 case ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY:\r
175 p = "group number is too big for capture history"; break;\r
176 case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\r
177 p = "invalid character property name {%n}"; break;\r
178 case ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION:\r
179 p = "not supported encoding combination"; break;\r
180 case ONIGERR_INVALID_COMBINATION_OF_OPTIONS:\r
181 p = "invalid combination of options"; break;\r
182 case ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT:\r
183 p = "over thread pass limit count"; break;\r
184\r
185 default:\r
186 p = "undefined error code"; break;\r
187 }\r
188\r
189 return (UChar* )p;\r
190}\r
191\r
192static void sprint_byte(char* s, unsigned int v)\r
193{\r
61e078dd 194 sprintf_s(s, sizeof("00"), "%02x", (v & 0377));\r
14b0e578
CS
195}\r
196\r
197static void sprint_byte_with_x(char* s, unsigned int v)\r
198{\r
61e078dd 199 sprintf_s(s, sizeof("\\x00"), "\\x%02x", (v & 0377));\r
14b0e578
CS
200}\r
201\r
202static int to_ascii(OnigEncoding enc, UChar *s, UChar *end,\r
203 UChar buf[], int buf_size, int *is_over)\r
204{\r
205 int len;\r
206 UChar *p;\r
207 OnigCodePoint code;\r
208\r
209 if (ONIGENC_MBC_MINLEN(enc) > 1) {\r
210 p = s;\r
211 len = 0;\r
212 while (p < end) {\r
213 code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
214 if (code >= 0x80) {\r
215 if (code > 0xffff && len + 10 <= buf_size) {\r
216 sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 24));\r
217 sprint_byte((char*)(&(buf[len+4])), (unsigned int)(code >> 16));\r
218 sprint_byte((char*)(&(buf[len+6])), (unsigned int)(code >> 8));\r
219 sprint_byte((char*)(&(buf[len+8])), (unsigned int)code);\r
220 len += 10;\r
221 }\r
222 else if (len + 6 <= buf_size) {\r
223 sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 8));\r
224 sprint_byte((char*)(&(buf[len+4])), (unsigned int)code);\r
225 len += 6;\r
226 }\r
227 else {\r
228 break;\r
229 }\r
230 }\r
231 else {\r
232 buf[len++] = (UChar )code;\r
233 }\r
234\r
235 p += enclen(enc, p);\r
236 if (len >= buf_size) break;\r
237 }\r
238\r
239 *is_over = ((p < end) ? 1 : 0);\r
240 }\r
241 else {\r
242 len = MIN((int)(end - s), buf_size);\r
243 xmemcpy(buf, s, (size_t )len);\r
244 *is_over = ((buf_size < (end - s)) ? 1 : 0);\r
245 }\r
246\r
247 return len;\r
248}\r
249\r
250\r
251/* for ONIG_MAX_ERROR_MESSAGE_LEN */\r
252#define MAX_ERROR_PAR_LEN 30\r
253\r
254extern int\r
a12b214e 255EFIAPI\r
14b0e578
CS
256#ifdef HAVE_STDARG_PROTOTYPES\r
257onig_error_code_to_str(UChar* s, int code, ...)\r
258#else\r
259onig_error_code_to_str(s, code, va_alist)\r
260 UChar* s;\r
261 int code;\r
262 va_dcl \r
263#endif\r
264{\r
265 UChar *p, *q;\r
266 OnigErrorInfo* einfo;\r
267 int len, is_over;\r
268 UChar parbuf[MAX_ERROR_PAR_LEN];\r
269 va_list vargs;\r
270\r
271 va_init_list(vargs, code);\r
272\r
273 switch (code) {\r
274 case ONIGERR_UNDEFINED_NAME_REFERENCE:\r
275 case ONIGERR_UNDEFINED_GROUP_REFERENCE:\r
276 case ONIGERR_MULTIPLEX_DEFINED_NAME:\r
277 case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\r
278 case ONIGERR_INVALID_GROUP_NAME:\r
279 case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\r
280 case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\r
281 einfo = va_arg(vargs, OnigErrorInfo*);\r
282 len = to_ascii(einfo->enc, einfo->par, einfo->par_end,\r
283 parbuf, MAX_ERROR_PAR_LEN - 3, &is_over);\r
284 q = onig_error_code_to_format(code);\r
285 p = s;\r
286 while (*q != '\0') {\r
287 if (*q == '%') {\r
288 q++;\r
289 if (*q == 'n') { /* '%n': name */\r
290 xmemcpy(p, parbuf, len);\r
291 p += len;\r
292 if (is_over != 0) {\r
293 xmemcpy(p, "...", 3);\r
294 p += 3;\r
295 }\r
296 q++;\r
297 }\r
298 else\r
299 goto normal_char;\r
300 }\r
301 else {\r
302 normal_char:\r
303 *p++ = *q++;\r
304 }\r
305 }\r
306 *p = '\0';\r
307 len = (int)(p - s);\r
308 break;\r
309\r
310 default:\r
311 q = onig_error_code_to_format(code);\r
b0c2b797
QS
312 if (q == NULL) {\r
313 len = 0;\r
314 break;\r
315 }\r
14b0e578
CS
316 len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, q);\r
317 xmemcpy(s, q, len);\r
318 s[len] = '\0';\r
319 break;\r
320 }\r
321\r
322 va_end(vargs);\r
323 return len;\r
324}\r
325\r
326\r
327void\r
a12b214e 328EFIAPI\r
14b0e578
CS
329#ifdef HAVE_STDARG_PROTOTYPES\r
330onig_snprintf_with_pattern(UChar buf[], int bufsize, OnigEncoding enc,\r
331 UChar* pat, UChar* pat_end, const UChar *fmt, ...)\r
332#else\r
333onig_snprintf_with_pattern(buf, bufsize, enc, pat, pat_end, fmt, va_alist)\r
334 UChar buf[];\r
335 int bufsize;\r
336 OnigEncoding enc;\r
337 UChar* pat;\r
338 UChar* pat_end;\r
339 const UChar *fmt;\r
340 va_dcl\r
341#endif\r
342{\r
343 int n, need, len;\r
344 UChar *p, *s, *bp;\r
345 UChar bs[6];\r
346 va_list args;\r
347\r
348 va_init_list(args, fmt);\r
349 n = xvsnprintf((char* )buf, bufsize, (const char* )fmt, args);\r
350 va_end(args);\r
351\r
352 need = (int)(pat_end - pat) * 4 + 4;\r
353\r
354 if (n + need < bufsize) {\r
355 strcat_s((char* )buf, bufsize, ": /");\r
356 s = buf + onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, buf);\r
357\r
358 p = pat;\r
359 while (p < pat_end) {\r
360 if (*p == '\\') {\r
361 *s++ = *p++;\r
362 len = enclen(enc, p);\r
363 while (len-- > 0) *s++ = *p++;\r
364 }\r
365 else if (*p == '/') {\r
366 *s++ = (unsigned char )'\\';\r
367 *s++ = *p++;\r
368 }\r
369 else if (ONIGENC_IS_MBC_HEAD(enc, p)) {\r
370 len = enclen(enc, p);\r
371 if (ONIGENC_MBC_MINLEN(enc) == 1) {\r
372 while (len-- > 0) *s++ = *p++;\r
373 }\r
374 else { /* for UTF16 */\r
375 int blen;\r
376\r
377 while (len-- > 0) {\r
378 sprint_byte_with_x((char* )bs, (unsigned int )(*p++));\r
379 blen = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\r
380 bp = bs;\r
381 while (blen-- > 0) *s++ = *bp++;\r
382 }\r
383 }\r
384 }\r
385 else if (!ONIGENC_IS_CODE_PRINT(enc, *p) &&\r
386 !ONIGENC_IS_CODE_SPACE(enc, *p)) {\r
387 sprint_byte_with_x((char* )bs, (unsigned int )(*p++));\r
388 len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\r
389 bp = bs;\r
390 while (len-- > 0) *s++ = *bp++;\r
391 }\r
392 else {\r
393 *s++ = *p++;\r
394 }\r
395 }\r
396\r
397 *s++ = '/';\r
398 *s = '\0';\r
399 }\r
400}\r