]>
Commit | Line | Data |
---|---|---|
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 | |
37 | extern UChar*\r | |
38 | onig_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 | |
199 | static 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 | |
204 | static 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 | |
209 | static 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 |
262 | extern int\r |
263 | onig_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 | 282 | extern 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 |
342 | void 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 |