1*22dc650dSSadaf Ebrahimi /*************************************************
2*22dc650dSSadaf Ebrahimi * Perl-Compatible Regular Expressions *
3*22dc650dSSadaf Ebrahimi *************************************************/
4*22dc650dSSadaf Ebrahimi
5*22dc650dSSadaf Ebrahimi /* PCRE is a library of functions to support regular expressions whose syntax
6*22dc650dSSadaf Ebrahimi and semantics are as close as possible to those of the Perl 5 language.
7*22dc650dSSadaf Ebrahimi
8*22dc650dSSadaf Ebrahimi Written by Philip Hazel
9*22dc650dSSadaf Ebrahimi Original API code Copyright (c) 1997-2012 University of Cambridge
10*22dc650dSSadaf Ebrahimi New API code Copyright (c) 2016-2024 University of Cambridge
11*22dc650dSSadaf Ebrahimi
12*22dc650dSSadaf Ebrahimi -----------------------------------------------------------------------------
13*22dc650dSSadaf Ebrahimi Redistribution and use in source and binary forms, with or without
14*22dc650dSSadaf Ebrahimi modification, are permitted provided that the following conditions are met:
15*22dc650dSSadaf Ebrahimi
16*22dc650dSSadaf Ebrahimi * Redistributions of source code must retain the above copyright notice,
17*22dc650dSSadaf Ebrahimi this list of conditions and the following disclaimer.
18*22dc650dSSadaf Ebrahimi
19*22dc650dSSadaf Ebrahimi * Redistributions in binary form must reproduce the above copyright
20*22dc650dSSadaf Ebrahimi notice, this list of conditions and the following disclaimer in the
21*22dc650dSSadaf Ebrahimi documentation and/or other materials provided with the distribution.
22*22dc650dSSadaf Ebrahimi
23*22dc650dSSadaf Ebrahimi * Neither the name of the University of Cambridge nor the names of its
24*22dc650dSSadaf Ebrahimi contributors may be used to endorse or promote products derived from
25*22dc650dSSadaf Ebrahimi this software without specific prior written permission.
26*22dc650dSSadaf Ebrahimi
27*22dc650dSSadaf Ebrahimi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28*22dc650dSSadaf Ebrahimi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29*22dc650dSSadaf Ebrahimi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30*22dc650dSSadaf Ebrahimi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31*22dc650dSSadaf Ebrahimi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32*22dc650dSSadaf Ebrahimi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33*22dc650dSSadaf Ebrahimi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34*22dc650dSSadaf Ebrahimi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35*22dc650dSSadaf Ebrahimi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36*22dc650dSSadaf Ebrahimi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37*22dc650dSSadaf Ebrahimi POSSIBILITY OF SUCH DAMAGE.
38*22dc650dSSadaf Ebrahimi -----------------------------------------------------------------------------
39*22dc650dSSadaf Ebrahimi */
40*22dc650dSSadaf Ebrahimi
41*22dc650dSSadaf Ebrahimi
42*22dc650dSSadaf Ebrahimi #ifdef HAVE_CONFIG_H
43*22dc650dSSadaf Ebrahimi #include "config.h"
44*22dc650dSSadaf Ebrahimi #endif
45*22dc650dSSadaf Ebrahimi
46*22dc650dSSadaf Ebrahimi #include "pcre2_internal.h"
47*22dc650dSSadaf Ebrahimi
48*22dc650dSSadaf Ebrahimi #define STRING(a) # a
49*22dc650dSSadaf Ebrahimi #define XSTRING(s) STRING(s)
50*22dc650dSSadaf Ebrahimi
51*22dc650dSSadaf Ebrahimi /* The texts of compile-time error messages. Compile-time error numbers start
52*22dc650dSSadaf Ebrahimi at COMPILE_ERROR_BASE (100).
53*22dc650dSSadaf Ebrahimi
54*22dc650dSSadaf Ebrahimi This used to be a table of strings, but in order to reduce the number of
55*22dc650dSSadaf Ebrahimi relocations needed when a shared library is loaded dynamically, it is now one
56*22dc650dSSadaf Ebrahimi long string. We cannot use a table of offsets, because the lengths of inserts
57*22dc650dSSadaf Ebrahimi such as XSTRING(MAX_NAME_SIZE) are not known. Instead,
58*22dc650dSSadaf Ebrahimi pcre2_get_error_message() counts through to the one it wants - this isn't a
59*22dc650dSSadaf Ebrahimi performance issue because these strings are used only when there is an error.
60*22dc650dSSadaf Ebrahimi
61*22dc650dSSadaf Ebrahimi Each substring ends with \0 to insert a null character. This includes the final
62*22dc650dSSadaf Ebrahimi substring, so that the whole string ends with \0\0, which can be detected when
63*22dc650dSSadaf Ebrahimi counting through. */
64*22dc650dSSadaf Ebrahimi
65*22dc650dSSadaf Ebrahimi static const unsigned char compile_error_texts[] =
66*22dc650dSSadaf Ebrahimi "no error\0"
67*22dc650dSSadaf Ebrahimi "\\ at end of pattern\0"
68*22dc650dSSadaf Ebrahimi "\\c at end of pattern\0"
69*22dc650dSSadaf Ebrahimi "unrecognized character follows \\\0"
70*22dc650dSSadaf Ebrahimi "numbers out of order in {} quantifier\0"
71*22dc650dSSadaf Ebrahimi /* 5 */
72*22dc650dSSadaf Ebrahimi "number too big in {} quantifier\0"
73*22dc650dSSadaf Ebrahimi "missing terminating ] for character class\0"
74*22dc650dSSadaf Ebrahimi "escape sequence is invalid in character class\0"
75*22dc650dSSadaf Ebrahimi "range out of order in character class\0"
76*22dc650dSSadaf Ebrahimi "quantifier does not follow a repeatable item\0"
77*22dc650dSSadaf Ebrahimi /* 10 */
78*22dc650dSSadaf Ebrahimi "internal error: unexpected repeat\0"
79*22dc650dSSadaf Ebrahimi "unrecognized character after (? or (?-\0"
80*22dc650dSSadaf Ebrahimi "POSIX named classes are supported only within a class\0"
81*22dc650dSSadaf Ebrahimi "POSIX collating elements are not supported\0"
82*22dc650dSSadaf Ebrahimi "missing closing parenthesis\0"
83*22dc650dSSadaf Ebrahimi /* 15 */
84*22dc650dSSadaf Ebrahimi "reference to non-existent subpattern\0"
85*22dc650dSSadaf Ebrahimi "pattern passed as NULL with non-zero length\0"
86*22dc650dSSadaf Ebrahimi "unrecognised compile-time option bit(s)\0"
87*22dc650dSSadaf Ebrahimi "missing ) after (?# comment\0"
88*22dc650dSSadaf Ebrahimi "parentheses are too deeply nested\0"
89*22dc650dSSadaf Ebrahimi /* 20 */
90*22dc650dSSadaf Ebrahimi "regular expression is too large\0"
91*22dc650dSSadaf Ebrahimi "failed to allocate heap memory\0"
92*22dc650dSSadaf Ebrahimi "unmatched closing parenthesis\0"
93*22dc650dSSadaf Ebrahimi "internal error: code overflow\0"
94*22dc650dSSadaf Ebrahimi "missing closing parenthesis for condition\0"
95*22dc650dSSadaf Ebrahimi /* 25 */
96*22dc650dSSadaf Ebrahimi "length of lookbehind assertion is not limited\0"
97*22dc650dSSadaf Ebrahimi "a relative value of zero is not allowed\0"
98*22dc650dSSadaf Ebrahimi "conditional subpattern contains more than two branches\0"
99*22dc650dSSadaf Ebrahimi "assertion expected after (?( or (?(?C)\0"
100*22dc650dSSadaf Ebrahimi "digit expected after (?+ or (?-\0"
101*22dc650dSSadaf Ebrahimi /* 30 */
102*22dc650dSSadaf Ebrahimi "unknown POSIX class name\0"
103*22dc650dSSadaf Ebrahimi "internal error in pcre2_study(): should not occur\0"
104*22dc650dSSadaf Ebrahimi "this version of PCRE2 does not have Unicode support\0"
105*22dc650dSSadaf Ebrahimi "parentheses are too deeply nested (stack check)\0"
106*22dc650dSSadaf Ebrahimi "character code point value in \\x{} or \\o{} is too large\0"
107*22dc650dSSadaf Ebrahimi /* 35 */
108*22dc650dSSadaf Ebrahimi "lookbehind is too complicated\0"
109*22dc650dSSadaf Ebrahimi "\\C is not allowed in a lookbehind assertion in UTF-" XSTRING(PCRE2_CODE_UNIT_WIDTH) " mode\0"
110*22dc650dSSadaf Ebrahimi "PCRE2 does not support \\F, \\L, \\l, \\N{name}, \\U, or \\u\0"
111*22dc650dSSadaf Ebrahimi "number after (?C is greater than 255\0"
112*22dc650dSSadaf Ebrahimi "closing parenthesis for (?C expected\0"
113*22dc650dSSadaf Ebrahimi /* 40 */
114*22dc650dSSadaf Ebrahimi "invalid escape sequence in (*VERB) name\0"
115*22dc650dSSadaf Ebrahimi "unrecognized character after (?P\0"
116*22dc650dSSadaf Ebrahimi "syntax error in subpattern name (missing terminator?)\0"
117*22dc650dSSadaf Ebrahimi "two named subpatterns have the same name (PCRE2_DUPNAMES not set)\0"
118*22dc650dSSadaf Ebrahimi "subpattern name must start with a non-digit\0"
119*22dc650dSSadaf Ebrahimi /* 45 */
120*22dc650dSSadaf Ebrahimi "this version of PCRE2 does not have support for \\P, \\p, or \\X\0"
121*22dc650dSSadaf Ebrahimi "malformed \\P or \\p sequence\0"
122*22dc650dSSadaf Ebrahimi "unknown property after \\P or \\p\0"
123*22dc650dSSadaf Ebrahimi "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " code units)\0"
124*22dc650dSSadaf Ebrahimi "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0"
125*22dc650dSSadaf Ebrahimi /* 50 */
126*22dc650dSSadaf Ebrahimi "invalid range in character class\0"
127*22dc650dSSadaf Ebrahimi "octal value is greater than \\377 in 8-bit non-UTF-8 mode\0"
128*22dc650dSSadaf Ebrahimi "internal error: overran compiling workspace\0"
129*22dc650dSSadaf Ebrahimi "internal error: previously-checked referenced subpattern not found\0"
130*22dc650dSSadaf Ebrahimi "DEFINE subpattern contains more than one branch\0"
131*22dc650dSSadaf Ebrahimi /* 55 */
132*22dc650dSSadaf Ebrahimi "missing opening brace after \\o\0"
133*22dc650dSSadaf Ebrahimi "internal error: unknown newline setting\0"
134*22dc650dSSadaf Ebrahimi "\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number\0"
135*22dc650dSSadaf Ebrahimi "(?R (recursive pattern call) must be followed by a closing parenthesis\0"
136*22dc650dSSadaf Ebrahimi /* "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\0" */
137*22dc650dSSadaf Ebrahimi "obsolete error (should not occur)\0" /* Was the above */
138*22dc650dSSadaf Ebrahimi /* 60 */
139*22dc650dSSadaf Ebrahimi "(*VERB) not recognized or malformed\0"
140*22dc650dSSadaf Ebrahimi "subpattern number is too big\0"
141*22dc650dSSadaf Ebrahimi "subpattern name expected\0"
142*22dc650dSSadaf Ebrahimi "internal error: parsed pattern overflow\0"
143*22dc650dSSadaf Ebrahimi "non-octal character in \\o{} (closing brace missing?)\0"
144*22dc650dSSadaf Ebrahimi /* 65 */
145*22dc650dSSadaf Ebrahimi "different names for subpatterns of the same number are not allowed\0"
146*22dc650dSSadaf Ebrahimi "(*MARK) must have an argument\0"
147*22dc650dSSadaf Ebrahimi "non-hex character in \\x{} (closing brace missing?)\0"
148*22dc650dSSadaf Ebrahimi #ifndef EBCDIC
149*22dc650dSSadaf Ebrahimi "\\c must be followed by a printable ASCII character\0"
150*22dc650dSSadaf Ebrahimi #else
151*22dc650dSSadaf Ebrahimi "\\c must be followed by a letter or one of [\\]^_?\0"
152*22dc650dSSadaf Ebrahimi #endif
153*22dc650dSSadaf Ebrahimi "\\k is not followed by a braced, angle-bracketed, or quoted name\0"
154*22dc650dSSadaf Ebrahimi /* 70 */
155*22dc650dSSadaf Ebrahimi "internal error: unknown meta code in check_lookbehinds()\0"
156*22dc650dSSadaf Ebrahimi "\\N is not supported in a class\0"
157*22dc650dSSadaf Ebrahimi "callout string is too long\0"
158*22dc650dSSadaf Ebrahimi "disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\0"
159*22dc650dSSadaf Ebrahimi "using UTF is disabled by the application\0"
160*22dc650dSSadaf Ebrahimi /* 75 */
161*22dc650dSSadaf Ebrahimi "using UCP is disabled by the application\0"
162*22dc650dSSadaf Ebrahimi "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\0"
163*22dc650dSSadaf Ebrahimi "character code point value in \\u.... sequence is too large\0"
164*22dc650dSSadaf Ebrahimi "digits missing in \\x{} or \\o{} or \\N{U+}\0"
165*22dc650dSSadaf Ebrahimi "syntax error or number too big in (?(VERSION condition\0"
166*22dc650dSSadaf Ebrahimi /* 80 */
167*22dc650dSSadaf Ebrahimi "internal error: unknown opcode in auto_possessify()\0"
168*22dc650dSSadaf Ebrahimi "missing terminating delimiter for callout with string argument\0"
169*22dc650dSSadaf Ebrahimi "unrecognized string delimiter follows (?C\0"
170*22dc650dSSadaf Ebrahimi "using \\C is disabled by the application\0"
171*22dc650dSSadaf Ebrahimi "(?| and/or (?J: or (?x: parentheses are too deeply nested\0"
172*22dc650dSSadaf Ebrahimi /* 85 */
173*22dc650dSSadaf Ebrahimi "using \\C is disabled in this PCRE2 library\0"
174*22dc650dSSadaf Ebrahimi "regular expression is too complicated\0"
175*22dc650dSSadaf Ebrahimi "lookbehind assertion is too long\0"
176*22dc650dSSadaf Ebrahimi "pattern string is longer than the limit set by the application\0"
177*22dc650dSSadaf Ebrahimi "internal error: unknown code in parsed pattern\0"
178*22dc650dSSadaf Ebrahimi /* 90 */
179*22dc650dSSadaf Ebrahimi "internal error: bad code value in parsed_skip()\0"
180*22dc650dSSadaf Ebrahimi "PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES is not allowed in UTF-16 mode\0"
181*22dc650dSSadaf Ebrahimi "invalid option bits with PCRE2_LITERAL\0"
182*22dc650dSSadaf Ebrahimi "\\N{U+dddd} is supported only in Unicode (UTF) mode\0"
183*22dc650dSSadaf Ebrahimi "invalid hyphen in option setting\0"
184*22dc650dSSadaf Ebrahimi /* 95 */
185*22dc650dSSadaf Ebrahimi "(*alpha_assertion) not recognized\0"
186*22dc650dSSadaf Ebrahimi "script runs require Unicode support, which this version of PCRE2 does not have\0"
187*22dc650dSSadaf Ebrahimi "too many capturing groups (maximum 65535)\0"
188*22dc650dSSadaf Ebrahimi "atomic assertion expected after (?( or (?(?C)\0"
189*22dc650dSSadaf Ebrahimi "\\K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)\0"
190*22dc650dSSadaf Ebrahimi /* 100 */
191*22dc650dSSadaf Ebrahimi "branch too long in variable-length lookbehind assertion\0"
192*22dc650dSSadaf Ebrahimi "compiled pattern would be longer than the limit set by the application\0"
193*22dc650dSSadaf Ebrahimi ;
194*22dc650dSSadaf Ebrahimi
195*22dc650dSSadaf Ebrahimi /* Match-time and UTF error texts are in the same format. */
196*22dc650dSSadaf Ebrahimi
197*22dc650dSSadaf Ebrahimi static const unsigned char match_error_texts[] =
198*22dc650dSSadaf Ebrahimi "no error\0"
199*22dc650dSSadaf Ebrahimi "no match\0"
200*22dc650dSSadaf Ebrahimi "partial match\0"
201*22dc650dSSadaf Ebrahimi "UTF-8 error: 1 byte missing at end\0"
202*22dc650dSSadaf Ebrahimi "UTF-8 error: 2 bytes missing at end\0"
203*22dc650dSSadaf Ebrahimi /* 5 */
204*22dc650dSSadaf Ebrahimi "UTF-8 error: 3 bytes missing at end\0"
205*22dc650dSSadaf Ebrahimi "UTF-8 error: 4 bytes missing at end\0"
206*22dc650dSSadaf Ebrahimi "UTF-8 error: 5 bytes missing at end\0"
207*22dc650dSSadaf Ebrahimi "UTF-8 error: byte 2 top bits not 0x80\0"
208*22dc650dSSadaf Ebrahimi "UTF-8 error: byte 3 top bits not 0x80\0"
209*22dc650dSSadaf Ebrahimi /* 10 */
210*22dc650dSSadaf Ebrahimi "UTF-8 error: byte 4 top bits not 0x80\0"
211*22dc650dSSadaf Ebrahimi "UTF-8 error: byte 5 top bits not 0x80\0"
212*22dc650dSSadaf Ebrahimi "UTF-8 error: byte 6 top bits not 0x80\0"
213*22dc650dSSadaf Ebrahimi "UTF-8 error: 5-byte character is not allowed (RFC 3629)\0"
214*22dc650dSSadaf Ebrahimi "UTF-8 error: 6-byte character is not allowed (RFC 3629)\0"
215*22dc650dSSadaf Ebrahimi /* 15 */
216*22dc650dSSadaf Ebrahimi "UTF-8 error: code points greater than 0x10ffff are not defined\0"
217*22dc650dSSadaf Ebrahimi "UTF-8 error: code points 0xd800-0xdfff are not defined\0"
218*22dc650dSSadaf Ebrahimi "UTF-8 error: overlong 2-byte sequence\0"
219*22dc650dSSadaf Ebrahimi "UTF-8 error: overlong 3-byte sequence\0"
220*22dc650dSSadaf Ebrahimi "UTF-8 error: overlong 4-byte sequence\0"
221*22dc650dSSadaf Ebrahimi /* 20 */
222*22dc650dSSadaf Ebrahimi "UTF-8 error: overlong 5-byte sequence\0"
223*22dc650dSSadaf Ebrahimi "UTF-8 error: overlong 6-byte sequence\0"
224*22dc650dSSadaf Ebrahimi "UTF-8 error: isolated byte with 0x80 bit set\0"
225*22dc650dSSadaf Ebrahimi "UTF-8 error: illegal byte (0xfe or 0xff)\0"
226*22dc650dSSadaf Ebrahimi "UTF-16 error: missing low surrogate at end\0"
227*22dc650dSSadaf Ebrahimi /* 25 */
228*22dc650dSSadaf Ebrahimi "UTF-16 error: invalid low surrogate\0"
229*22dc650dSSadaf Ebrahimi "UTF-16 error: isolated low surrogate\0"
230*22dc650dSSadaf Ebrahimi "UTF-32 error: code points 0xd800-0xdfff are not defined\0"
231*22dc650dSSadaf Ebrahimi "UTF-32 error: code points greater than 0x10ffff are not defined\0"
232*22dc650dSSadaf Ebrahimi "bad data value\0"
233*22dc650dSSadaf Ebrahimi /* 30 */
234*22dc650dSSadaf Ebrahimi "patterns do not all use the same character tables\0"
235*22dc650dSSadaf Ebrahimi "magic number missing\0"
236*22dc650dSSadaf Ebrahimi "pattern compiled in wrong mode: 8/16/32-bit error\0"
237*22dc650dSSadaf Ebrahimi "bad offset value\0"
238*22dc650dSSadaf Ebrahimi "bad option value\0"
239*22dc650dSSadaf Ebrahimi /* 35 */
240*22dc650dSSadaf Ebrahimi "invalid replacement string\0"
241*22dc650dSSadaf Ebrahimi "bad offset into UTF string\0"
242*22dc650dSSadaf Ebrahimi "callout error code\0" /* Never returned by PCRE2 itself */
243*22dc650dSSadaf Ebrahimi "invalid data in workspace for DFA restart\0"
244*22dc650dSSadaf Ebrahimi "too much recursion for DFA matching\0"
245*22dc650dSSadaf Ebrahimi /* 40 */
246*22dc650dSSadaf Ebrahimi "backreference condition or recursion test is not supported for DFA matching\0"
247*22dc650dSSadaf Ebrahimi "function is not supported for DFA matching\0"
248*22dc650dSSadaf Ebrahimi "pattern contains an item that is not supported for DFA matching\0"
249*22dc650dSSadaf Ebrahimi "workspace size exceeded in DFA matching\0"
250*22dc650dSSadaf Ebrahimi "internal error - pattern overwritten?\0"
251*22dc650dSSadaf Ebrahimi /* 45 */
252*22dc650dSSadaf Ebrahimi "bad JIT option\0"
253*22dc650dSSadaf Ebrahimi "JIT stack limit reached\0"
254*22dc650dSSadaf Ebrahimi "match limit exceeded\0"
255*22dc650dSSadaf Ebrahimi "no more memory\0"
256*22dc650dSSadaf Ebrahimi "unknown substring\0"
257*22dc650dSSadaf Ebrahimi /* 50 */
258*22dc650dSSadaf Ebrahimi "non-unique substring name\0"
259*22dc650dSSadaf Ebrahimi "NULL argument passed with non-zero length\0"
260*22dc650dSSadaf Ebrahimi "nested recursion at the same subject position\0"
261*22dc650dSSadaf Ebrahimi "matching depth limit exceeded\0"
262*22dc650dSSadaf Ebrahimi "requested value is not available\0"
263*22dc650dSSadaf Ebrahimi /* 55 */
264*22dc650dSSadaf Ebrahimi "requested value is not set\0"
265*22dc650dSSadaf Ebrahimi "offset limit set without PCRE2_USE_OFFSET_LIMIT\0"
266*22dc650dSSadaf Ebrahimi "bad escape sequence in replacement string\0"
267*22dc650dSSadaf Ebrahimi "expected closing curly bracket in replacement string\0"
268*22dc650dSSadaf Ebrahimi "bad substitution in replacement string\0"
269*22dc650dSSadaf Ebrahimi /* 60 */
270*22dc650dSSadaf Ebrahimi "match with end before start or start moved backwards is not supported\0"
271*22dc650dSSadaf Ebrahimi "too many replacements (more than INT_MAX)\0"
272*22dc650dSSadaf Ebrahimi "bad serialized data\0"
273*22dc650dSSadaf Ebrahimi "heap limit exceeded\0"
274*22dc650dSSadaf Ebrahimi "invalid syntax\0"
275*22dc650dSSadaf Ebrahimi /* 65 */
276*22dc650dSSadaf Ebrahimi "internal error - duplicate substitution match\0"
277*22dc650dSSadaf Ebrahimi "PCRE2_MATCH_INVALID_UTF is not supported for DFA matching\0"
278*22dc650dSSadaf Ebrahimi "INTERNAL ERROR: invalid substring offset\0"
279*22dc650dSSadaf Ebrahimi ;
280*22dc650dSSadaf Ebrahimi
281*22dc650dSSadaf Ebrahimi
282*22dc650dSSadaf Ebrahimi /*************************************************
283*22dc650dSSadaf Ebrahimi * Return error message *
284*22dc650dSSadaf Ebrahimi *************************************************/
285*22dc650dSSadaf Ebrahimi
286*22dc650dSSadaf Ebrahimi /* This function copies an error message into a buffer whose units are of an
287*22dc650dSSadaf Ebrahimi appropriate width. Error numbers are positive for compile-time errors, and
288*22dc650dSSadaf Ebrahimi negative for match-time errors (except for UTF errors), but the numbers are all
289*22dc650dSSadaf Ebrahimi distinct.
290*22dc650dSSadaf Ebrahimi
291*22dc650dSSadaf Ebrahimi Arguments:
292*22dc650dSSadaf Ebrahimi enumber error number
293*22dc650dSSadaf Ebrahimi buffer where to put the message (zero terminated)
294*22dc650dSSadaf Ebrahimi size size of the buffer in code units
295*22dc650dSSadaf Ebrahimi
296*22dc650dSSadaf Ebrahimi Returns: length of message if all is well
297*22dc650dSSadaf Ebrahimi negative on error
298*22dc650dSSadaf Ebrahimi */
299*22dc650dSSadaf Ebrahimi
300*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_get_error_message(int enumber,PCRE2_UCHAR * buffer,PCRE2_SIZE size)301*22dc650dSSadaf Ebrahimi pcre2_get_error_message(int enumber, PCRE2_UCHAR *buffer, PCRE2_SIZE size)
302*22dc650dSSadaf Ebrahimi {
303*22dc650dSSadaf Ebrahimi const unsigned char *message;
304*22dc650dSSadaf Ebrahimi PCRE2_SIZE i;
305*22dc650dSSadaf Ebrahimi int n;
306*22dc650dSSadaf Ebrahimi
307*22dc650dSSadaf Ebrahimi if (size == 0) return PCRE2_ERROR_NOMEMORY;
308*22dc650dSSadaf Ebrahimi
309*22dc650dSSadaf Ebrahimi if (enumber >= COMPILE_ERROR_BASE) /* Compile error */
310*22dc650dSSadaf Ebrahimi {
311*22dc650dSSadaf Ebrahimi message = compile_error_texts;
312*22dc650dSSadaf Ebrahimi n = enumber - COMPILE_ERROR_BASE;
313*22dc650dSSadaf Ebrahimi }
314*22dc650dSSadaf Ebrahimi else if (enumber < 0) /* Match or UTF error */
315*22dc650dSSadaf Ebrahimi {
316*22dc650dSSadaf Ebrahimi message = match_error_texts;
317*22dc650dSSadaf Ebrahimi n = -enumber;
318*22dc650dSSadaf Ebrahimi }
319*22dc650dSSadaf Ebrahimi else /* Invalid error number */
320*22dc650dSSadaf Ebrahimi {
321*22dc650dSSadaf Ebrahimi message = (unsigned char *)"\0"; /* Empty message list */
322*22dc650dSSadaf Ebrahimi n = 1;
323*22dc650dSSadaf Ebrahimi }
324*22dc650dSSadaf Ebrahimi
325*22dc650dSSadaf Ebrahimi for (; n > 0; n--)
326*22dc650dSSadaf Ebrahimi {
327*22dc650dSSadaf Ebrahimi while (*message++ != CHAR_NUL) {};
328*22dc650dSSadaf Ebrahimi if (*message == CHAR_NUL) return PCRE2_ERROR_BADDATA;
329*22dc650dSSadaf Ebrahimi }
330*22dc650dSSadaf Ebrahimi
331*22dc650dSSadaf Ebrahimi for (i = 0; *message != 0; i++)
332*22dc650dSSadaf Ebrahimi {
333*22dc650dSSadaf Ebrahimi if (i >= size - 1)
334*22dc650dSSadaf Ebrahimi {
335*22dc650dSSadaf Ebrahimi buffer[i] = 0; /* Terminate partial message */
336*22dc650dSSadaf Ebrahimi return PCRE2_ERROR_NOMEMORY;
337*22dc650dSSadaf Ebrahimi }
338*22dc650dSSadaf Ebrahimi buffer[i] = *message++;
339*22dc650dSSadaf Ebrahimi }
340*22dc650dSSadaf Ebrahimi
341*22dc650dSSadaf Ebrahimi buffer[i] = 0;
342*22dc650dSSadaf Ebrahimi return (int)i;
343*22dc650dSSadaf Ebrahimi }
344*22dc650dSSadaf Ebrahimi
345*22dc650dSSadaf Ebrahimi /* End of pcre2_error.c */
346