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
49*22dc650dSSadaf Ebrahimi
50*22dc650dSSadaf Ebrahimi /*************************************************
51*22dc650dSSadaf Ebrahimi * Default malloc/free functions *
52*22dc650dSSadaf Ebrahimi *************************************************/
53*22dc650dSSadaf Ebrahimi
54*22dc650dSSadaf Ebrahimi /* Ignore the "user data" argument in each case. */
55*22dc650dSSadaf Ebrahimi
default_malloc(size_t size,void * data)56*22dc650dSSadaf Ebrahimi static void *default_malloc(size_t size, void *data)
57*22dc650dSSadaf Ebrahimi {
58*22dc650dSSadaf Ebrahimi (void)data;
59*22dc650dSSadaf Ebrahimi return malloc(size);
60*22dc650dSSadaf Ebrahimi }
61*22dc650dSSadaf Ebrahimi
62*22dc650dSSadaf Ebrahimi
default_free(void * block,void * data)63*22dc650dSSadaf Ebrahimi static void default_free(void *block, void *data)
64*22dc650dSSadaf Ebrahimi {
65*22dc650dSSadaf Ebrahimi (void)data;
66*22dc650dSSadaf Ebrahimi free(block);
67*22dc650dSSadaf Ebrahimi }
68*22dc650dSSadaf Ebrahimi
69*22dc650dSSadaf Ebrahimi
70*22dc650dSSadaf Ebrahimi
71*22dc650dSSadaf Ebrahimi /*************************************************
72*22dc650dSSadaf Ebrahimi * Get a block and save memory control *
73*22dc650dSSadaf Ebrahimi *************************************************/
74*22dc650dSSadaf Ebrahimi
75*22dc650dSSadaf Ebrahimi /* This internal function is called to get a block of memory in which the
76*22dc650dSSadaf Ebrahimi memory control data is to be stored at the start for future use.
77*22dc650dSSadaf Ebrahimi
78*22dc650dSSadaf Ebrahimi Arguments:
79*22dc650dSSadaf Ebrahimi size amount of memory required
80*22dc650dSSadaf Ebrahimi memctl pointer to a memctl block or NULL
81*22dc650dSSadaf Ebrahimi
82*22dc650dSSadaf Ebrahimi Returns: pointer to memory or NULL on failure
83*22dc650dSSadaf Ebrahimi */
84*22dc650dSSadaf Ebrahimi
85*22dc650dSSadaf Ebrahimi extern void *
PRIV(memctl_malloc)86*22dc650dSSadaf Ebrahimi PRIV(memctl_malloc)(size_t size, pcre2_memctl *memctl)
87*22dc650dSSadaf Ebrahimi {
88*22dc650dSSadaf Ebrahimi pcre2_memctl *newmemctl;
89*22dc650dSSadaf Ebrahimi void *yield = (memctl == NULL)? malloc(size) :
90*22dc650dSSadaf Ebrahimi memctl->malloc(size, memctl->memory_data);
91*22dc650dSSadaf Ebrahimi if (yield == NULL) return NULL;
92*22dc650dSSadaf Ebrahimi newmemctl = (pcre2_memctl *)yield;
93*22dc650dSSadaf Ebrahimi if (memctl == NULL)
94*22dc650dSSadaf Ebrahimi {
95*22dc650dSSadaf Ebrahimi newmemctl->malloc = default_malloc;
96*22dc650dSSadaf Ebrahimi newmemctl->free = default_free;
97*22dc650dSSadaf Ebrahimi newmemctl->memory_data = NULL;
98*22dc650dSSadaf Ebrahimi }
99*22dc650dSSadaf Ebrahimi else *newmemctl = *memctl;
100*22dc650dSSadaf Ebrahimi return yield;
101*22dc650dSSadaf Ebrahimi }
102*22dc650dSSadaf Ebrahimi
103*22dc650dSSadaf Ebrahimi
104*22dc650dSSadaf Ebrahimi
105*22dc650dSSadaf Ebrahimi /*************************************************
106*22dc650dSSadaf Ebrahimi * Create and initialize contexts *
107*22dc650dSSadaf Ebrahimi *************************************************/
108*22dc650dSSadaf Ebrahimi
109*22dc650dSSadaf Ebrahimi /* Initializing for compile and match contexts is done in separate, private
110*22dc650dSSadaf Ebrahimi functions so that these can be called from functions such as pcre2_compile()
111*22dc650dSSadaf Ebrahimi when an external context is not supplied. The initializing functions have an
112*22dc650dSSadaf Ebrahimi option to set up default memory management. */
113*22dc650dSSadaf Ebrahimi
114*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_general_context * PCRE2_CALL_CONVENTION
pcre2_general_context_create(void * (* private_malloc)(size_t,void *),void (* private_free)(void *,void *),void * memory_data)115*22dc650dSSadaf Ebrahimi pcre2_general_context_create(void *(*private_malloc)(size_t, void *),
116*22dc650dSSadaf Ebrahimi void (*private_free)(void *, void *), void *memory_data)
117*22dc650dSSadaf Ebrahimi {
118*22dc650dSSadaf Ebrahimi pcre2_general_context *gcontext;
119*22dc650dSSadaf Ebrahimi if (private_malloc == NULL) private_malloc = default_malloc;
120*22dc650dSSadaf Ebrahimi if (private_free == NULL) private_free = default_free;
121*22dc650dSSadaf Ebrahimi gcontext = private_malloc(sizeof(pcre2_real_general_context), memory_data);
122*22dc650dSSadaf Ebrahimi if (gcontext == NULL) return NULL;
123*22dc650dSSadaf Ebrahimi gcontext->memctl.malloc = private_malloc;
124*22dc650dSSadaf Ebrahimi gcontext->memctl.free = private_free;
125*22dc650dSSadaf Ebrahimi gcontext->memctl.memory_data = memory_data;
126*22dc650dSSadaf Ebrahimi return gcontext;
127*22dc650dSSadaf Ebrahimi }
128*22dc650dSSadaf Ebrahimi
129*22dc650dSSadaf Ebrahimi
130*22dc650dSSadaf Ebrahimi /* A default compile context is set up to save having to initialize at run time
131*22dc650dSSadaf Ebrahimi when no context is supplied to the compile function. */
132*22dc650dSSadaf Ebrahimi
133*22dc650dSSadaf Ebrahimi const pcre2_compile_context PRIV(default_compile_context) = {
134*22dc650dSSadaf Ebrahimi { default_malloc, default_free, NULL }, /* Default memory handling */
135*22dc650dSSadaf Ebrahimi NULL, /* Stack guard */
136*22dc650dSSadaf Ebrahimi NULL, /* Stack guard data */
137*22dc650dSSadaf Ebrahimi PRIV(default_tables), /* Character tables */
138*22dc650dSSadaf Ebrahimi PCRE2_UNSET, /* Max pattern length */
139*22dc650dSSadaf Ebrahimi PCRE2_UNSET, /* Max pattern compiled length */
140*22dc650dSSadaf Ebrahimi BSR_DEFAULT, /* Backslash R default */
141*22dc650dSSadaf Ebrahimi NEWLINE_DEFAULT, /* Newline convention */
142*22dc650dSSadaf Ebrahimi PARENS_NEST_LIMIT, /* As it says */
143*22dc650dSSadaf Ebrahimi 0, /* Extra options */
144*22dc650dSSadaf Ebrahimi MAX_VARLOOKBEHIND /* As it says */
145*22dc650dSSadaf Ebrahimi };
146*22dc650dSSadaf Ebrahimi
147*22dc650dSSadaf Ebrahimi /* The create function copies the default into the new memory, but must
148*22dc650dSSadaf Ebrahimi override the default memory handling functions if a gcontext was provided. */
149*22dc650dSSadaf Ebrahimi
150*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_compile_context * PCRE2_CALL_CONVENTION
pcre2_compile_context_create(pcre2_general_context * gcontext)151*22dc650dSSadaf Ebrahimi pcre2_compile_context_create(pcre2_general_context *gcontext)
152*22dc650dSSadaf Ebrahimi {
153*22dc650dSSadaf Ebrahimi pcre2_compile_context *ccontext = PRIV(memctl_malloc)(
154*22dc650dSSadaf Ebrahimi sizeof(pcre2_real_compile_context), (pcre2_memctl *)gcontext);
155*22dc650dSSadaf Ebrahimi if (ccontext == NULL) return NULL;
156*22dc650dSSadaf Ebrahimi *ccontext = PRIV(default_compile_context);
157*22dc650dSSadaf Ebrahimi if (gcontext != NULL)
158*22dc650dSSadaf Ebrahimi *((pcre2_memctl *)ccontext) = *((pcre2_memctl *)gcontext);
159*22dc650dSSadaf Ebrahimi return ccontext;
160*22dc650dSSadaf Ebrahimi }
161*22dc650dSSadaf Ebrahimi
162*22dc650dSSadaf Ebrahimi
163*22dc650dSSadaf Ebrahimi /* A default match context is set up to save having to initialize at run time
164*22dc650dSSadaf Ebrahimi when no context is supplied to a match function. */
165*22dc650dSSadaf Ebrahimi
166*22dc650dSSadaf Ebrahimi const pcre2_match_context PRIV(default_match_context) = {
167*22dc650dSSadaf Ebrahimi { default_malloc, default_free, NULL },
168*22dc650dSSadaf Ebrahimi #ifdef SUPPORT_JIT
169*22dc650dSSadaf Ebrahimi NULL, /* JIT callback */
170*22dc650dSSadaf Ebrahimi NULL, /* JIT callback data */
171*22dc650dSSadaf Ebrahimi #endif
172*22dc650dSSadaf Ebrahimi NULL, /* Callout function */
173*22dc650dSSadaf Ebrahimi NULL, /* Callout data */
174*22dc650dSSadaf Ebrahimi NULL, /* Substitute callout function */
175*22dc650dSSadaf Ebrahimi NULL, /* Substitute callout data */
176*22dc650dSSadaf Ebrahimi PCRE2_UNSET, /* Offset limit */
177*22dc650dSSadaf Ebrahimi HEAP_LIMIT,
178*22dc650dSSadaf Ebrahimi MATCH_LIMIT,
179*22dc650dSSadaf Ebrahimi MATCH_LIMIT_DEPTH };
180*22dc650dSSadaf Ebrahimi
181*22dc650dSSadaf Ebrahimi /* The create function copies the default into the new memory, but must
182*22dc650dSSadaf Ebrahimi override the default memory handling functions if a gcontext was provided. */
183*22dc650dSSadaf Ebrahimi
184*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_match_context * PCRE2_CALL_CONVENTION
pcre2_match_context_create(pcre2_general_context * gcontext)185*22dc650dSSadaf Ebrahimi pcre2_match_context_create(pcre2_general_context *gcontext)
186*22dc650dSSadaf Ebrahimi {
187*22dc650dSSadaf Ebrahimi pcre2_match_context *mcontext = PRIV(memctl_malloc)(
188*22dc650dSSadaf Ebrahimi sizeof(pcre2_real_match_context), (pcre2_memctl *)gcontext);
189*22dc650dSSadaf Ebrahimi if (mcontext == NULL) return NULL;
190*22dc650dSSadaf Ebrahimi *mcontext = PRIV(default_match_context);
191*22dc650dSSadaf Ebrahimi if (gcontext != NULL)
192*22dc650dSSadaf Ebrahimi *((pcre2_memctl *)mcontext) = *((pcre2_memctl *)gcontext);
193*22dc650dSSadaf Ebrahimi return mcontext;
194*22dc650dSSadaf Ebrahimi }
195*22dc650dSSadaf Ebrahimi
196*22dc650dSSadaf Ebrahimi
197*22dc650dSSadaf Ebrahimi /* A default convert context is set up to save having to initialize at run time
198*22dc650dSSadaf Ebrahimi when no context is supplied to the convert function. */
199*22dc650dSSadaf Ebrahimi
200*22dc650dSSadaf Ebrahimi const pcre2_convert_context PRIV(default_convert_context) = {
201*22dc650dSSadaf Ebrahimi { default_malloc, default_free, NULL }, /* Default memory handling */
202*22dc650dSSadaf Ebrahimi #ifdef _WIN32
203*22dc650dSSadaf Ebrahimi CHAR_BACKSLASH, /* Default path separator */
204*22dc650dSSadaf Ebrahimi CHAR_GRAVE_ACCENT /* Default escape character */
205*22dc650dSSadaf Ebrahimi #else /* Not Windows */
206*22dc650dSSadaf Ebrahimi CHAR_SLASH, /* Default path separator */
207*22dc650dSSadaf Ebrahimi CHAR_BACKSLASH /* Default escape character */
208*22dc650dSSadaf Ebrahimi #endif
209*22dc650dSSadaf Ebrahimi };
210*22dc650dSSadaf Ebrahimi
211*22dc650dSSadaf Ebrahimi /* The create function copies the default into the new memory, but must
212*22dc650dSSadaf Ebrahimi override the default memory handling functions if a gcontext was provided. */
213*22dc650dSSadaf Ebrahimi
214*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_convert_context * PCRE2_CALL_CONVENTION
pcre2_convert_context_create(pcre2_general_context * gcontext)215*22dc650dSSadaf Ebrahimi pcre2_convert_context_create(pcre2_general_context *gcontext)
216*22dc650dSSadaf Ebrahimi {
217*22dc650dSSadaf Ebrahimi pcre2_convert_context *ccontext = PRIV(memctl_malloc)(
218*22dc650dSSadaf Ebrahimi sizeof(pcre2_real_convert_context), (pcre2_memctl *)gcontext);
219*22dc650dSSadaf Ebrahimi if (ccontext == NULL) return NULL;
220*22dc650dSSadaf Ebrahimi *ccontext = PRIV(default_convert_context);
221*22dc650dSSadaf Ebrahimi if (gcontext != NULL)
222*22dc650dSSadaf Ebrahimi *((pcre2_memctl *)ccontext) = *((pcre2_memctl *)gcontext);
223*22dc650dSSadaf Ebrahimi return ccontext;
224*22dc650dSSadaf Ebrahimi }
225*22dc650dSSadaf Ebrahimi
226*22dc650dSSadaf Ebrahimi
227*22dc650dSSadaf Ebrahimi /*************************************************
228*22dc650dSSadaf Ebrahimi * Context copy functions *
229*22dc650dSSadaf Ebrahimi *************************************************/
230*22dc650dSSadaf Ebrahimi
231*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_general_context * PCRE2_CALL_CONVENTION
pcre2_general_context_copy(pcre2_general_context * gcontext)232*22dc650dSSadaf Ebrahimi pcre2_general_context_copy(pcre2_general_context *gcontext)
233*22dc650dSSadaf Ebrahimi {
234*22dc650dSSadaf Ebrahimi pcre2_general_context *newcontext =
235*22dc650dSSadaf Ebrahimi gcontext->memctl.malloc(sizeof(pcre2_real_general_context),
236*22dc650dSSadaf Ebrahimi gcontext->memctl.memory_data);
237*22dc650dSSadaf Ebrahimi if (newcontext == NULL) return NULL;
238*22dc650dSSadaf Ebrahimi memcpy(newcontext, gcontext, sizeof(pcre2_real_general_context));
239*22dc650dSSadaf Ebrahimi return newcontext;
240*22dc650dSSadaf Ebrahimi }
241*22dc650dSSadaf Ebrahimi
242*22dc650dSSadaf Ebrahimi
243*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_compile_context * PCRE2_CALL_CONVENTION
pcre2_compile_context_copy(pcre2_compile_context * ccontext)244*22dc650dSSadaf Ebrahimi pcre2_compile_context_copy(pcre2_compile_context *ccontext)
245*22dc650dSSadaf Ebrahimi {
246*22dc650dSSadaf Ebrahimi pcre2_compile_context *newcontext =
247*22dc650dSSadaf Ebrahimi ccontext->memctl.malloc(sizeof(pcre2_real_compile_context),
248*22dc650dSSadaf Ebrahimi ccontext->memctl.memory_data);
249*22dc650dSSadaf Ebrahimi if (newcontext == NULL) return NULL;
250*22dc650dSSadaf Ebrahimi memcpy(newcontext, ccontext, sizeof(pcre2_real_compile_context));
251*22dc650dSSadaf Ebrahimi return newcontext;
252*22dc650dSSadaf Ebrahimi }
253*22dc650dSSadaf Ebrahimi
254*22dc650dSSadaf Ebrahimi
255*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_match_context * PCRE2_CALL_CONVENTION
pcre2_match_context_copy(pcre2_match_context * mcontext)256*22dc650dSSadaf Ebrahimi pcre2_match_context_copy(pcre2_match_context *mcontext)
257*22dc650dSSadaf Ebrahimi {
258*22dc650dSSadaf Ebrahimi pcre2_match_context *newcontext =
259*22dc650dSSadaf Ebrahimi mcontext->memctl.malloc(sizeof(pcre2_real_match_context),
260*22dc650dSSadaf Ebrahimi mcontext->memctl.memory_data);
261*22dc650dSSadaf Ebrahimi if (newcontext == NULL) return NULL;
262*22dc650dSSadaf Ebrahimi memcpy(newcontext, mcontext, sizeof(pcre2_real_match_context));
263*22dc650dSSadaf Ebrahimi return newcontext;
264*22dc650dSSadaf Ebrahimi }
265*22dc650dSSadaf Ebrahimi
266*22dc650dSSadaf Ebrahimi
267*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_convert_context * PCRE2_CALL_CONVENTION
pcre2_convert_context_copy(pcre2_convert_context * ccontext)268*22dc650dSSadaf Ebrahimi pcre2_convert_context_copy(pcre2_convert_context *ccontext)
269*22dc650dSSadaf Ebrahimi {
270*22dc650dSSadaf Ebrahimi pcre2_convert_context *newcontext =
271*22dc650dSSadaf Ebrahimi ccontext->memctl.malloc(sizeof(pcre2_real_convert_context),
272*22dc650dSSadaf Ebrahimi ccontext->memctl.memory_data);
273*22dc650dSSadaf Ebrahimi if (newcontext == NULL) return NULL;
274*22dc650dSSadaf Ebrahimi memcpy(newcontext, ccontext, sizeof(pcre2_real_convert_context));
275*22dc650dSSadaf Ebrahimi return newcontext;
276*22dc650dSSadaf Ebrahimi }
277*22dc650dSSadaf Ebrahimi
278*22dc650dSSadaf Ebrahimi
279*22dc650dSSadaf Ebrahimi /*************************************************
280*22dc650dSSadaf Ebrahimi * Context free functions *
281*22dc650dSSadaf Ebrahimi *************************************************/
282*22dc650dSSadaf Ebrahimi
283*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
pcre2_general_context_free(pcre2_general_context * gcontext)284*22dc650dSSadaf Ebrahimi pcre2_general_context_free(pcre2_general_context *gcontext)
285*22dc650dSSadaf Ebrahimi {
286*22dc650dSSadaf Ebrahimi if (gcontext != NULL)
287*22dc650dSSadaf Ebrahimi gcontext->memctl.free(gcontext, gcontext->memctl.memory_data);
288*22dc650dSSadaf Ebrahimi }
289*22dc650dSSadaf Ebrahimi
290*22dc650dSSadaf Ebrahimi
291*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
pcre2_compile_context_free(pcre2_compile_context * ccontext)292*22dc650dSSadaf Ebrahimi pcre2_compile_context_free(pcre2_compile_context *ccontext)
293*22dc650dSSadaf Ebrahimi {
294*22dc650dSSadaf Ebrahimi if (ccontext != NULL)
295*22dc650dSSadaf Ebrahimi ccontext->memctl.free(ccontext, ccontext->memctl.memory_data);
296*22dc650dSSadaf Ebrahimi }
297*22dc650dSSadaf Ebrahimi
298*22dc650dSSadaf Ebrahimi
299*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
pcre2_match_context_free(pcre2_match_context * mcontext)300*22dc650dSSadaf Ebrahimi pcre2_match_context_free(pcre2_match_context *mcontext)
301*22dc650dSSadaf Ebrahimi {
302*22dc650dSSadaf Ebrahimi if (mcontext != NULL)
303*22dc650dSSadaf Ebrahimi mcontext->memctl.free(mcontext, mcontext->memctl.memory_data);
304*22dc650dSSadaf Ebrahimi }
305*22dc650dSSadaf Ebrahimi
306*22dc650dSSadaf Ebrahimi
307*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
pcre2_convert_context_free(pcre2_convert_context * ccontext)308*22dc650dSSadaf Ebrahimi pcre2_convert_context_free(pcre2_convert_context *ccontext)
309*22dc650dSSadaf Ebrahimi {
310*22dc650dSSadaf Ebrahimi if (ccontext != NULL)
311*22dc650dSSadaf Ebrahimi ccontext->memctl.free(ccontext, ccontext->memctl.memory_data);
312*22dc650dSSadaf Ebrahimi }
313*22dc650dSSadaf Ebrahimi
314*22dc650dSSadaf Ebrahimi
315*22dc650dSSadaf Ebrahimi /*************************************************
316*22dc650dSSadaf Ebrahimi * Set values in contexts *
317*22dc650dSSadaf Ebrahimi *************************************************/
318*22dc650dSSadaf Ebrahimi
319*22dc650dSSadaf Ebrahimi /* All these functions return 0 for success or PCRE2_ERROR_BADDATA if invalid
320*22dc650dSSadaf Ebrahimi data is given. Only some of the functions are able to test the validity of the
321*22dc650dSSadaf Ebrahimi data. */
322*22dc650dSSadaf Ebrahimi
323*22dc650dSSadaf Ebrahimi
324*22dc650dSSadaf Ebrahimi /* ------------ Compile context ------------ */
325*22dc650dSSadaf Ebrahimi
326*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_character_tables(pcre2_compile_context * ccontext,const uint8_t * tables)327*22dc650dSSadaf Ebrahimi pcre2_set_character_tables(pcre2_compile_context *ccontext,
328*22dc650dSSadaf Ebrahimi const uint8_t *tables)
329*22dc650dSSadaf Ebrahimi {
330*22dc650dSSadaf Ebrahimi ccontext->tables = tables;
331*22dc650dSSadaf Ebrahimi return 0;
332*22dc650dSSadaf Ebrahimi }
333*22dc650dSSadaf Ebrahimi
334*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_bsr(pcre2_compile_context * ccontext,uint32_t value)335*22dc650dSSadaf Ebrahimi pcre2_set_bsr(pcre2_compile_context *ccontext, uint32_t value)
336*22dc650dSSadaf Ebrahimi {
337*22dc650dSSadaf Ebrahimi switch(value)
338*22dc650dSSadaf Ebrahimi {
339*22dc650dSSadaf Ebrahimi case PCRE2_BSR_ANYCRLF:
340*22dc650dSSadaf Ebrahimi case PCRE2_BSR_UNICODE:
341*22dc650dSSadaf Ebrahimi ccontext->bsr_convention = value;
342*22dc650dSSadaf Ebrahimi return 0;
343*22dc650dSSadaf Ebrahimi
344*22dc650dSSadaf Ebrahimi default:
345*22dc650dSSadaf Ebrahimi return PCRE2_ERROR_BADDATA;
346*22dc650dSSadaf Ebrahimi }
347*22dc650dSSadaf Ebrahimi }
348*22dc650dSSadaf Ebrahimi
349*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_max_pattern_length(pcre2_compile_context * ccontext,PCRE2_SIZE length)350*22dc650dSSadaf Ebrahimi pcre2_set_max_pattern_length(pcre2_compile_context *ccontext, PCRE2_SIZE length)
351*22dc650dSSadaf Ebrahimi {
352*22dc650dSSadaf Ebrahimi ccontext->max_pattern_length = length;
353*22dc650dSSadaf Ebrahimi return 0;
354*22dc650dSSadaf Ebrahimi }
355*22dc650dSSadaf Ebrahimi
356*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_max_pattern_compiled_length(pcre2_compile_context * ccontext,PCRE2_SIZE length)357*22dc650dSSadaf Ebrahimi pcre2_set_max_pattern_compiled_length(pcre2_compile_context *ccontext, PCRE2_SIZE length)
358*22dc650dSSadaf Ebrahimi {
359*22dc650dSSadaf Ebrahimi ccontext->max_pattern_compiled_length = length;
360*22dc650dSSadaf Ebrahimi return 0;
361*22dc650dSSadaf Ebrahimi }
362*22dc650dSSadaf Ebrahimi
363*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_newline(pcre2_compile_context * ccontext,uint32_t newline)364*22dc650dSSadaf Ebrahimi pcre2_set_newline(pcre2_compile_context *ccontext, uint32_t newline)
365*22dc650dSSadaf Ebrahimi {
366*22dc650dSSadaf Ebrahimi switch(newline)
367*22dc650dSSadaf Ebrahimi {
368*22dc650dSSadaf Ebrahimi case PCRE2_NEWLINE_CR:
369*22dc650dSSadaf Ebrahimi case PCRE2_NEWLINE_LF:
370*22dc650dSSadaf Ebrahimi case PCRE2_NEWLINE_CRLF:
371*22dc650dSSadaf Ebrahimi case PCRE2_NEWLINE_ANY:
372*22dc650dSSadaf Ebrahimi case PCRE2_NEWLINE_ANYCRLF:
373*22dc650dSSadaf Ebrahimi case PCRE2_NEWLINE_NUL:
374*22dc650dSSadaf Ebrahimi ccontext->newline_convention = newline;
375*22dc650dSSadaf Ebrahimi return 0;
376*22dc650dSSadaf Ebrahimi
377*22dc650dSSadaf Ebrahimi default:
378*22dc650dSSadaf Ebrahimi return PCRE2_ERROR_BADDATA;
379*22dc650dSSadaf Ebrahimi }
380*22dc650dSSadaf Ebrahimi }
381*22dc650dSSadaf Ebrahimi
382*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_max_varlookbehind(pcre2_compile_context * ccontext,uint32_t limit)383*22dc650dSSadaf Ebrahimi pcre2_set_max_varlookbehind(pcre2_compile_context *ccontext, uint32_t limit)
384*22dc650dSSadaf Ebrahimi {
385*22dc650dSSadaf Ebrahimi ccontext->max_varlookbehind = limit;
386*22dc650dSSadaf Ebrahimi return 0;
387*22dc650dSSadaf Ebrahimi }
388*22dc650dSSadaf Ebrahimi
389*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_parens_nest_limit(pcre2_compile_context * ccontext,uint32_t limit)390*22dc650dSSadaf Ebrahimi pcre2_set_parens_nest_limit(pcre2_compile_context *ccontext, uint32_t limit)
391*22dc650dSSadaf Ebrahimi {
392*22dc650dSSadaf Ebrahimi ccontext->parens_nest_limit = limit;
393*22dc650dSSadaf Ebrahimi return 0;
394*22dc650dSSadaf Ebrahimi }
395*22dc650dSSadaf Ebrahimi
396*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_compile_extra_options(pcre2_compile_context * ccontext,uint32_t options)397*22dc650dSSadaf Ebrahimi pcre2_set_compile_extra_options(pcre2_compile_context *ccontext, uint32_t options)
398*22dc650dSSadaf Ebrahimi {
399*22dc650dSSadaf Ebrahimi ccontext->extra_options = options;
400*22dc650dSSadaf Ebrahimi return 0;
401*22dc650dSSadaf Ebrahimi }
402*22dc650dSSadaf Ebrahimi
403*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_compile_recursion_guard(pcre2_compile_context * ccontext,int (* guard)(uint32_t,void *),void * user_data)404*22dc650dSSadaf Ebrahimi pcre2_set_compile_recursion_guard(pcre2_compile_context *ccontext,
405*22dc650dSSadaf Ebrahimi int (*guard)(uint32_t, void *), void *user_data)
406*22dc650dSSadaf Ebrahimi {
407*22dc650dSSadaf Ebrahimi ccontext->stack_guard = guard;
408*22dc650dSSadaf Ebrahimi ccontext->stack_guard_data = user_data;
409*22dc650dSSadaf Ebrahimi return 0;
410*22dc650dSSadaf Ebrahimi }
411*22dc650dSSadaf Ebrahimi
412*22dc650dSSadaf Ebrahimi
413*22dc650dSSadaf Ebrahimi /* ------------ Match context ------------ */
414*22dc650dSSadaf Ebrahimi
415*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_callout(pcre2_match_context * mcontext,int (* callout)(pcre2_callout_block *,void *),void * callout_data)416*22dc650dSSadaf Ebrahimi pcre2_set_callout(pcre2_match_context *mcontext,
417*22dc650dSSadaf Ebrahimi int (*callout)(pcre2_callout_block *, void *), void *callout_data)
418*22dc650dSSadaf Ebrahimi {
419*22dc650dSSadaf Ebrahimi mcontext->callout = callout;
420*22dc650dSSadaf Ebrahimi mcontext->callout_data = callout_data;
421*22dc650dSSadaf Ebrahimi return 0;
422*22dc650dSSadaf Ebrahimi }
423*22dc650dSSadaf Ebrahimi
424*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_substitute_callout(pcre2_match_context * mcontext,int (* substitute_callout)(pcre2_substitute_callout_block *,void *),void * substitute_callout_data)425*22dc650dSSadaf Ebrahimi pcre2_set_substitute_callout(pcre2_match_context *mcontext,
426*22dc650dSSadaf Ebrahimi int (*substitute_callout)(pcre2_substitute_callout_block *, void *),
427*22dc650dSSadaf Ebrahimi void *substitute_callout_data)
428*22dc650dSSadaf Ebrahimi {
429*22dc650dSSadaf Ebrahimi mcontext->substitute_callout = substitute_callout;
430*22dc650dSSadaf Ebrahimi mcontext->substitute_callout_data = substitute_callout_data;
431*22dc650dSSadaf Ebrahimi return 0;
432*22dc650dSSadaf Ebrahimi }
433*22dc650dSSadaf Ebrahimi
434*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_heap_limit(pcre2_match_context * mcontext,uint32_t limit)435*22dc650dSSadaf Ebrahimi pcre2_set_heap_limit(pcre2_match_context *mcontext, uint32_t limit)
436*22dc650dSSadaf Ebrahimi {
437*22dc650dSSadaf Ebrahimi mcontext->heap_limit = limit;
438*22dc650dSSadaf Ebrahimi return 0;
439*22dc650dSSadaf Ebrahimi }
440*22dc650dSSadaf Ebrahimi
441*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_match_limit(pcre2_match_context * mcontext,uint32_t limit)442*22dc650dSSadaf Ebrahimi pcre2_set_match_limit(pcre2_match_context *mcontext, uint32_t limit)
443*22dc650dSSadaf Ebrahimi {
444*22dc650dSSadaf Ebrahimi mcontext->match_limit = limit;
445*22dc650dSSadaf Ebrahimi return 0;
446*22dc650dSSadaf Ebrahimi }
447*22dc650dSSadaf Ebrahimi
448*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_depth_limit(pcre2_match_context * mcontext,uint32_t limit)449*22dc650dSSadaf Ebrahimi pcre2_set_depth_limit(pcre2_match_context *mcontext, uint32_t limit)
450*22dc650dSSadaf Ebrahimi {
451*22dc650dSSadaf Ebrahimi mcontext->depth_limit = limit;
452*22dc650dSSadaf Ebrahimi return 0;
453*22dc650dSSadaf Ebrahimi }
454*22dc650dSSadaf Ebrahimi
455*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_offset_limit(pcre2_match_context * mcontext,PCRE2_SIZE limit)456*22dc650dSSadaf Ebrahimi pcre2_set_offset_limit(pcre2_match_context *mcontext, PCRE2_SIZE limit)
457*22dc650dSSadaf Ebrahimi {
458*22dc650dSSadaf Ebrahimi mcontext->offset_limit = limit;
459*22dc650dSSadaf Ebrahimi return 0;
460*22dc650dSSadaf Ebrahimi }
461*22dc650dSSadaf Ebrahimi
462*22dc650dSSadaf Ebrahimi /* These functions became obsolete at release 10.30. The first is kept as a
463*22dc650dSSadaf Ebrahimi synonym for backwards compatibility. The second now does nothing. Exclude both
464*22dc650dSSadaf Ebrahimi from coverage reports. */
465*22dc650dSSadaf Ebrahimi
466*22dc650dSSadaf Ebrahimi /* LCOV_EXCL_START */
467*22dc650dSSadaf Ebrahimi
468*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_recursion_limit(pcre2_match_context * mcontext,uint32_t limit)469*22dc650dSSadaf Ebrahimi pcre2_set_recursion_limit(pcre2_match_context *mcontext, uint32_t limit)
470*22dc650dSSadaf Ebrahimi {
471*22dc650dSSadaf Ebrahimi return pcre2_set_depth_limit(mcontext, limit);
472*22dc650dSSadaf Ebrahimi }
473*22dc650dSSadaf Ebrahimi
474*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_recursion_memory_management(pcre2_match_context * mcontext,void * (* mymalloc)(size_t,void *),void (* myfree)(void *,void *),void * mydata)475*22dc650dSSadaf Ebrahimi pcre2_set_recursion_memory_management(pcre2_match_context *mcontext,
476*22dc650dSSadaf Ebrahimi void *(*mymalloc)(size_t, void *), void (*myfree)(void *, void *),
477*22dc650dSSadaf Ebrahimi void *mydata)
478*22dc650dSSadaf Ebrahimi {
479*22dc650dSSadaf Ebrahimi (void)mcontext;
480*22dc650dSSadaf Ebrahimi (void)mymalloc;
481*22dc650dSSadaf Ebrahimi (void)myfree;
482*22dc650dSSadaf Ebrahimi (void)mydata;
483*22dc650dSSadaf Ebrahimi return 0;
484*22dc650dSSadaf Ebrahimi }
485*22dc650dSSadaf Ebrahimi
486*22dc650dSSadaf Ebrahimi /* LCOV_EXCL_STOP */
487*22dc650dSSadaf Ebrahimi
488*22dc650dSSadaf Ebrahimi
489*22dc650dSSadaf Ebrahimi /* ------------ Convert context ------------ */
490*22dc650dSSadaf Ebrahimi
491*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_glob_separator(pcre2_convert_context * ccontext,uint32_t separator)492*22dc650dSSadaf Ebrahimi pcre2_set_glob_separator(pcre2_convert_context *ccontext, uint32_t separator)
493*22dc650dSSadaf Ebrahimi {
494*22dc650dSSadaf Ebrahimi if (separator != CHAR_SLASH && separator != CHAR_BACKSLASH &&
495*22dc650dSSadaf Ebrahimi separator != CHAR_DOT) return PCRE2_ERROR_BADDATA;
496*22dc650dSSadaf Ebrahimi ccontext->glob_separator = separator;
497*22dc650dSSadaf Ebrahimi return 0;
498*22dc650dSSadaf Ebrahimi }
499*22dc650dSSadaf Ebrahimi
500*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_glob_escape(pcre2_convert_context * ccontext,uint32_t escape)501*22dc650dSSadaf Ebrahimi pcre2_set_glob_escape(pcre2_convert_context *ccontext, uint32_t escape)
502*22dc650dSSadaf Ebrahimi {
503*22dc650dSSadaf Ebrahimi if (escape > 255 || (escape != 0 && !ispunct(escape)))
504*22dc650dSSadaf Ebrahimi return PCRE2_ERROR_BADDATA;
505*22dc650dSSadaf Ebrahimi ccontext->glob_escape = escape;
506*22dc650dSSadaf Ebrahimi return 0;
507*22dc650dSSadaf Ebrahimi }
508*22dc650dSSadaf Ebrahimi
509*22dc650dSSadaf Ebrahimi /* End of pcre2_context.c */
510*22dc650dSSadaf Ebrahimi
511