xref: /aosp_15_r20/external/pcre/src/pcre2_match_data.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-2022 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 *  Create a match data block given ovector size  *
52*22dc650dSSadaf Ebrahimi *************************************************/
53*22dc650dSSadaf Ebrahimi 
54*22dc650dSSadaf Ebrahimi /* A minimum of 1 is imposed on the number of ovector pairs. A maximum is also
55*22dc650dSSadaf Ebrahimi imposed because the oveccount field in a match data block is uintt6_t. */
56*22dc650dSSadaf Ebrahimi 
57*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_match_data * PCRE2_CALL_CONVENTION
pcre2_match_data_create(uint32_t oveccount,pcre2_general_context * gcontext)58*22dc650dSSadaf Ebrahimi pcre2_match_data_create(uint32_t oveccount, pcre2_general_context *gcontext)
59*22dc650dSSadaf Ebrahimi {
60*22dc650dSSadaf Ebrahimi pcre2_match_data *yield;
61*22dc650dSSadaf Ebrahimi if (oveccount < 1) oveccount = 1;
62*22dc650dSSadaf Ebrahimi if (oveccount > UINT16_MAX) oveccount = UINT16_MAX;
63*22dc650dSSadaf Ebrahimi yield = PRIV(memctl_malloc)(
64*22dc650dSSadaf Ebrahimi   offsetof(pcre2_match_data, ovector) + 2*oveccount*sizeof(PCRE2_SIZE),
65*22dc650dSSadaf Ebrahimi   (pcre2_memctl *)gcontext);
66*22dc650dSSadaf Ebrahimi if (yield == NULL) return NULL;
67*22dc650dSSadaf Ebrahimi yield->oveccount = oveccount;
68*22dc650dSSadaf Ebrahimi yield->flags = 0;
69*22dc650dSSadaf Ebrahimi yield->heapframes = NULL;
70*22dc650dSSadaf Ebrahimi yield->heapframes_size = 0;
71*22dc650dSSadaf Ebrahimi return yield;
72*22dc650dSSadaf Ebrahimi }
73*22dc650dSSadaf Ebrahimi 
74*22dc650dSSadaf Ebrahimi 
75*22dc650dSSadaf Ebrahimi 
76*22dc650dSSadaf Ebrahimi /*************************************************
77*22dc650dSSadaf Ebrahimi *  Create a match data block using pattern data  *
78*22dc650dSSadaf Ebrahimi *************************************************/
79*22dc650dSSadaf Ebrahimi 
80*22dc650dSSadaf Ebrahimi /* If no context is supplied, use the memory allocator from the code. */
81*22dc650dSSadaf Ebrahimi 
82*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN pcre2_match_data * PCRE2_CALL_CONVENTION
pcre2_match_data_create_from_pattern(const pcre2_code * code,pcre2_general_context * gcontext)83*22dc650dSSadaf Ebrahimi pcre2_match_data_create_from_pattern(const pcre2_code *code,
84*22dc650dSSadaf Ebrahimi   pcre2_general_context *gcontext)
85*22dc650dSSadaf Ebrahimi {
86*22dc650dSSadaf Ebrahimi if (gcontext == NULL) gcontext = (pcre2_general_context *)code;
87*22dc650dSSadaf Ebrahimi return pcre2_match_data_create(((pcre2_real_code *)code)->top_bracket + 1,
88*22dc650dSSadaf Ebrahimi   gcontext);
89*22dc650dSSadaf Ebrahimi }
90*22dc650dSSadaf Ebrahimi 
91*22dc650dSSadaf Ebrahimi 
92*22dc650dSSadaf Ebrahimi 
93*22dc650dSSadaf Ebrahimi /*************************************************
94*22dc650dSSadaf Ebrahimi *            Free a match data block             *
95*22dc650dSSadaf Ebrahimi *************************************************/
96*22dc650dSSadaf Ebrahimi 
97*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
pcre2_match_data_free(pcre2_match_data * match_data)98*22dc650dSSadaf Ebrahimi pcre2_match_data_free(pcre2_match_data *match_data)
99*22dc650dSSadaf Ebrahimi {
100*22dc650dSSadaf Ebrahimi if (match_data != NULL)
101*22dc650dSSadaf Ebrahimi   {
102*22dc650dSSadaf Ebrahimi   if (match_data->heapframes != NULL)
103*22dc650dSSadaf Ebrahimi     match_data->memctl.free(match_data->heapframes,
104*22dc650dSSadaf Ebrahimi       match_data->memctl.memory_data);
105*22dc650dSSadaf Ebrahimi   if ((match_data->flags & PCRE2_MD_COPIED_SUBJECT) != 0)
106*22dc650dSSadaf Ebrahimi     match_data->memctl.free((void *)match_data->subject,
107*22dc650dSSadaf Ebrahimi       match_data->memctl.memory_data);
108*22dc650dSSadaf Ebrahimi   match_data->memctl.free(match_data, match_data->memctl.memory_data);
109*22dc650dSSadaf Ebrahimi   }
110*22dc650dSSadaf Ebrahimi }
111*22dc650dSSadaf Ebrahimi 
112*22dc650dSSadaf Ebrahimi 
113*22dc650dSSadaf Ebrahimi 
114*22dc650dSSadaf Ebrahimi /*************************************************
115*22dc650dSSadaf Ebrahimi *         Get last mark in match                 *
116*22dc650dSSadaf Ebrahimi *************************************************/
117*22dc650dSSadaf Ebrahimi 
118*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN PCRE2_SPTR PCRE2_CALL_CONVENTION
pcre2_get_mark(pcre2_match_data * match_data)119*22dc650dSSadaf Ebrahimi pcre2_get_mark(pcre2_match_data *match_data)
120*22dc650dSSadaf Ebrahimi {
121*22dc650dSSadaf Ebrahimi return match_data->mark;
122*22dc650dSSadaf Ebrahimi }
123*22dc650dSSadaf Ebrahimi 
124*22dc650dSSadaf Ebrahimi 
125*22dc650dSSadaf Ebrahimi 
126*22dc650dSSadaf Ebrahimi /*************************************************
127*22dc650dSSadaf Ebrahimi *          Get pointer to ovector                *
128*22dc650dSSadaf Ebrahimi *************************************************/
129*22dc650dSSadaf Ebrahimi 
130*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN PCRE2_SIZE * PCRE2_CALL_CONVENTION
pcre2_get_ovector_pointer(pcre2_match_data * match_data)131*22dc650dSSadaf Ebrahimi pcre2_get_ovector_pointer(pcre2_match_data *match_data)
132*22dc650dSSadaf Ebrahimi {
133*22dc650dSSadaf Ebrahimi return match_data->ovector;
134*22dc650dSSadaf Ebrahimi }
135*22dc650dSSadaf Ebrahimi 
136*22dc650dSSadaf Ebrahimi 
137*22dc650dSSadaf Ebrahimi 
138*22dc650dSSadaf Ebrahimi /*************************************************
139*22dc650dSSadaf Ebrahimi *          Get number of ovector slots           *
140*22dc650dSSadaf Ebrahimi *************************************************/
141*22dc650dSSadaf Ebrahimi 
142*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN uint32_t PCRE2_CALL_CONVENTION
pcre2_get_ovector_count(pcre2_match_data * match_data)143*22dc650dSSadaf Ebrahimi pcre2_get_ovector_count(pcre2_match_data *match_data)
144*22dc650dSSadaf Ebrahimi {
145*22dc650dSSadaf Ebrahimi return match_data->oveccount;
146*22dc650dSSadaf Ebrahimi }
147*22dc650dSSadaf Ebrahimi 
148*22dc650dSSadaf Ebrahimi 
149*22dc650dSSadaf Ebrahimi 
150*22dc650dSSadaf Ebrahimi /*************************************************
151*22dc650dSSadaf Ebrahimi *         Get starting code unit in match        *
152*22dc650dSSadaf Ebrahimi *************************************************/
153*22dc650dSSadaf Ebrahimi 
154*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN PCRE2_SIZE PCRE2_CALL_CONVENTION
pcre2_get_startchar(pcre2_match_data * match_data)155*22dc650dSSadaf Ebrahimi pcre2_get_startchar(pcre2_match_data *match_data)
156*22dc650dSSadaf Ebrahimi {
157*22dc650dSSadaf Ebrahimi return match_data->startchar;
158*22dc650dSSadaf Ebrahimi }
159*22dc650dSSadaf Ebrahimi 
160*22dc650dSSadaf Ebrahimi 
161*22dc650dSSadaf Ebrahimi 
162*22dc650dSSadaf Ebrahimi /*************************************************
163*22dc650dSSadaf Ebrahimi *         Get size of match data block           *
164*22dc650dSSadaf Ebrahimi *************************************************/
165*22dc650dSSadaf Ebrahimi 
166*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN PCRE2_SIZE PCRE2_CALL_CONVENTION
pcre2_get_match_data_size(pcre2_match_data * match_data)167*22dc650dSSadaf Ebrahimi pcre2_get_match_data_size(pcre2_match_data *match_data)
168*22dc650dSSadaf Ebrahimi {
169*22dc650dSSadaf Ebrahimi return offsetof(pcre2_match_data, ovector) +
170*22dc650dSSadaf Ebrahimi   2 * (match_data->oveccount) * sizeof(PCRE2_SIZE);
171*22dc650dSSadaf Ebrahimi }
172*22dc650dSSadaf Ebrahimi 
173*22dc650dSSadaf Ebrahimi 
174*22dc650dSSadaf Ebrahimi 
175*22dc650dSSadaf Ebrahimi /*************************************************
176*22dc650dSSadaf Ebrahimi *             Get heapframes size                *
177*22dc650dSSadaf Ebrahimi *************************************************/
178*22dc650dSSadaf Ebrahimi 
179*22dc650dSSadaf Ebrahimi PCRE2_EXP_DEFN PCRE2_SIZE PCRE2_CALL_CONVENTION
pcre2_get_match_data_heapframes_size(pcre2_match_data * match_data)180*22dc650dSSadaf Ebrahimi pcre2_get_match_data_heapframes_size(pcre2_match_data *match_data)
181*22dc650dSSadaf Ebrahimi {
182*22dc650dSSadaf Ebrahimi return match_data->heapframes_size;
183*22dc650dSSadaf Ebrahimi }
184*22dc650dSSadaf Ebrahimi 
185*22dc650dSSadaf Ebrahimi /* End of pcre2_match_data.c */
186