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