xref: /aosp_15_r20/external/pcre/src/pcre2_context.c (revision 22dc650d8ae982c6770746019a6f94af92b0f024)
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