Line | Source Code | Coverage |
---|
1 | /************************************************* | - |
2 | * Perl-Compatible Regular Expressions * | - |
3 | *************************************************/ | - |
4 | | - |
5 | /* PCRE is a library of functions to support regular expressions whose syntax | - |
6 | and semantics are as close as possible to those of the Perl 5 language. | - |
7 | | - |
8 | Written by Philip Hazel | - |
9 | Copyright (c) 1997-2012 University of Cambridge | - |
10 | | - |
11 | ----------------------------------------------------------------------------- | - |
12 | Redistribution and use in source and binary forms, with or without | - |
13 | modification, are permitted provided that the following conditions are met: | - |
14 | | - |
15 | * Redistributions of source code must retain the above copyright notice, | - |
16 | this list of conditions and the following disclaimer. | - |
17 | | - |
18 | * Redistributions in binary form must reproduce the above copyright | - |
19 | notice, this list of conditions and the following disclaimer in the | - |
20 | documentation and/or other materials provided with the distribution. | - |
21 | | - |
22 | * Neither the name of the University of Cambridge nor the names of its | - |
23 | contributors may be used to endorse or promote products derived from | - |
24 | this software without specific prior written permission. | - |
25 | | - |
26 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | - |
27 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | - |
28 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | - |
29 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | - |
30 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | - |
31 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | - |
32 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | - |
33 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | - |
34 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | - |
35 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | - |
36 | POSSIBILITY OF SUCH DAMAGE. | - |
37 | ----------------------------------------------------------------------------- | - |
38 | */ | - |
39 | | - |
40 | | - |
41 | /* This module contains some convenience functions for extracting substrings | - |
42 | from the subject string after a regex match has succeeded. The original idea | - |
43 | for these functions came from Scott Wimer. */ | - |
44 | | - |
45 | | - |
46 | #ifdef PCRE_HAVE_CONFIG_H | - |
47 | #include "config.h" | - |
48 | #endif | - |
49 | | - |
50 | #include "pcre_internal.h" | - |
51 | | - |
52 | | - |
53 | /************************************************* | - |
54 | * Find number for named string * | - |
55 | *************************************************/ | - |
56 | | - |
57 | /* This function is used by the get_first_set() function below, as well | - |
58 | as being generally available. It assumes that names are unique. | - |
59 | | - |
60 | Arguments: | - |
61 | code the compiled regex | - |
62 | stringname the name whose number is required | - |
63 | | - |
64 | Returns: the number of the named parentheses, or a negative number | - |
65 | (PCRE_ERROR_NOSUBSTRING) if not found | - |
66 | */ | - |
67 | | - |
68 | #ifdef COMPILE_PCRE8 | - |
69 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
70 | pcre_get_stringnumber(const pcre *code, const char *stringname) | - |
71 | #else | - |
72 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
73 | pcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname) | - |
74 | #endif | - |
75 | { | - |
76 | int rc; executed (the execution status of this line is deduced): int rc; | - |
77 | int entrysize; executed (the execution status of this line is deduced): int entrysize; | - |
78 | int top, bot; executed (the execution status of this line is deduced): int top, bot; | - |
79 | pcre_uchar *nametable; executed (the execution status of this line is deduced): pcre_uchar *nametable; | - |
80 | | - |
81 | #ifdef COMPILE_PCRE8 | - |
82 | if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) | - |
83 | return rc; | - |
84 | if (top <= 0) return PCRE_ERROR_NOSUBSTRING; | - |
85 | | - |
86 | if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) | - |
87 | return rc; | - |
88 | if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) | - |
89 | return rc; | - |
90 | #endif | - |
91 | #ifdef COMPILE_PCRE16 | - |
92 | if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) partially evaluated: (rc = pcre16_fullinfo(code, ((void *)0), 8, &top)) != 0 no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
93 | return rc; never executed: return rc; | 0 |
94 | if (top <= 0) return PCRE_ERROR_NOSUBSTRING; never executed: return (-7); partially evaluated: top <= 0 no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
95 | | - |
96 | if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) partially evaluated: (rc = pcre16_fullinfo(code, ((void *)0), 7, &entrysize)) != 0 no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
97 | return rc; never executed: return rc; | 0 |
98 | if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) partially evaluated: (rc = pcre16_fullinfo(code, ((void *)0), 9, &nametable)) != 0 no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
99 | return rc; never executed: return rc; | 0 |
100 | #endif | - |
101 | | - |
102 | bot = 0; executed (the execution status of this line is deduced): bot = 0; | - |
103 | while (top > bot) evaluated: top > bot yes Evaluation Count:17 | yes Evaluation Count:6 |
| 6-17 |
104 | { | - |
105 | int mid = (top + bot) / 2; executed (the execution status of this line is deduced): int mid = (top + bot) / 2; | - |
106 | pcre_uchar *entry = nametable + entrysize*mid; executed (the execution status of this line is deduced): pcre_uchar *entry = nametable + entrysize*mid; | - |
107 | int c = STRCMP_UC_UC((pcre_uchar *)stringname, executed (the execution status of this line is deduced): int c = _pcre16_strcmp_uc_uc(((pcre_uchar *)stringname), ((pcre_uchar *)(entry + 1))); | - |
108 | (pcre_uchar *)(entry + IMM2_SIZE)); | - |
109 | if (c == 0) return GET2(entry, 0); executed: return entry[0]; Execution Count:6 evaluated: c == 0 yes Evaluation Count:6 | yes Evaluation Count:11 |
| 6-11 |
110 | if (c > 0) bot = mid + 1; else top = mid; executed: bot = mid + 1; Execution Count:6 executed: top = mid; Execution Count:5 evaluated: c > 0 yes Evaluation Count:6 | yes Evaluation Count:5 |
| 5-6 |
111 | } | - |
112 | | - |
113 | return PCRE_ERROR_NOSUBSTRING; executed: return (-7); Execution Count:6 | 6 |
114 | } | - |
115 | | - |
116 | | - |
117 | | - |
118 | /************************************************* | - |
119 | * Find (multiple) entries for named string * | - |
120 | *************************************************/ | - |
121 | | - |
122 | /* This is used by the get_first_set() function below, as well as being | - |
123 | generally available. It is used when duplicated names are permitted. | - |
124 | | - |
125 | Arguments: | - |
126 | code the compiled regex | - |
127 | stringname the name whose entries required | - |
128 | firstptr where to put the pointer to the first entry | - |
129 | lastptr where to put the pointer to the last entry | - |
130 | | - |
131 | Returns: the length of each entry, or a negative number | - |
132 | (PCRE_ERROR_NOSUBSTRING) if not found | - |
133 | */ | - |
134 | | - |
135 | #ifdef COMPILE_PCRE8 | - |
136 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
137 | pcre_get_stringtable_entries(const pcre *code, const char *stringname, | - |
138 | char **firstptr, char **lastptr) | - |
139 | #else | - |
140 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
141 | pcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname, | - |
142 | PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr) | - |
143 | #endif | - |
144 | { | - |
145 | int rc; never executed (the execution status of this line is deduced): int rc; | - |
146 | int entrysize; never executed (the execution status of this line is deduced): int entrysize; | - |
147 | int top, bot; never executed (the execution status of this line is deduced): int top, bot; | - |
148 | pcre_uchar *nametable, *lastentry; never executed (the execution status of this line is deduced): pcre_uchar *nametable, *lastentry; | - |
149 | | - |
150 | #ifdef COMPILE_PCRE8 | - |
151 | if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) | - |
152 | return rc; | - |
153 | if (top <= 0) return PCRE_ERROR_NOSUBSTRING; | - |
154 | | - |
155 | if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) | - |
156 | return rc; | - |
157 | if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) | - |
158 | return rc; | - |
159 | #endif | - |
160 | #ifdef COMPILE_PCRE16 | - |
161 | if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) never evaluated: (rc = pcre16_fullinfo(code, ((void *)0), 8, &top)) != 0 | 0 |
162 | return rc; never executed: return rc; | 0 |
163 | if (top <= 0) return PCRE_ERROR_NOSUBSTRING; never executed: return (-7); never evaluated: top <= 0 | 0 |
164 | | - |
165 | if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) never evaluated: (rc = pcre16_fullinfo(code, ((void *)0), 7, &entrysize)) != 0 | 0 |
166 | return rc; never executed: return rc; | 0 |
167 | if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) never evaluated: (rc = pcre16_fullinfo(code, ((void *)0), 9, &nametable)) != 0 | 0 |
168 | return rc; never executed: return rc; | 0 |
169 | #endif | - |
170 | | - |
171 | lastentry = nametable + entrysize * (top - 1); never executed (the execution status of this line is deduced): lastentry = nametable + entrysize * (top - 1); | - |
172 | bot = 0; never executed (the execution status of this line is deduced): bot = 0; | - |
173 | while (top > bot) never evaluated: top > bot | 0 |
174 | { | - |
175 | int mid = (top + bot) / 2; never executed (the execution status of this line is deduced): int mid = (top + bot) / 2; | - |
176 | pcre_uchar *entry = nametable + entrysize*mid; never executed (the execution status of this line is deduced): pcre_uchar *entry = nametable + entrysize*mid; | - |
177 | int c = STRCMP_UC_UC((pcre_uchar *)stringname, never executed (the execution status of this line is deduced): int c = _pcre16_strcmp_uc_uc(((pcre_uchar *)stringname), ((pcre_uchar *)(entry + 1))); | - |
178 | (pcre_uchar *)(entry + IMM2_SIZE)); | - |
179 | if (c == 0) | 0 |
180 | { | - |
181 | pcre_uchar *first = entry; never executed (the execution status of this line is deduced): pcre_uchar *first = entry; | - |
182 | pcre_uchar *last = entry; never executed (the execution status of this line is deduced): pcre_uchar *last = entry; | - |
183 | while (first > nametable) never evaluated: first > nametable | 0 |
184 | { | - |
185 | if (STRCMP_UC_UC((pcre_uchar *)stringname, never executed: break; never evaluated: _pcre16_strcmp_uc_uc(((pcre_uchar *)stringname), ((pcre_uchar *)(first - entrysize + 1))) != 0 | 0 |
186 | (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break; | - |
187 | first -= entrysize; never executed (the execution status of this line is deduced): first -= entrysize; | - |
188 | } | 0 |
189 | while (last < lastentry) never evaluated: last < lastentry | 0 |
190 | { | - |
191 | if (STRCMP_UC_UC((pcre_uchar *)stringname, never executed: break; never evaluated: _pcre16_strcmp_uc_uc(((pcre_uchar *)stringname), ((pcre_uchar *)(last + entrysize + 1))) != 0 | 0 |
192 | (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break; | - |
193 | last += entrysize; never executed (the execution status of this line is deduced): last += entrysize; | - |
194 | } | 0 |
195 | #ifdef COMPILE_PCRE8 | - |
196 | *firstptr = (char *)first; | - |
197 | *lastptr = (char *)last; | - |
198 | #else | - |
199 | *firstptr = (PCRE_UCHAR16 *)first; never executed (the execution status of this line is deduced): *firstptr = (unsigned short *)first; | - |
200 | *lastptr = (PCRE_UCHAR16 *)last; never executed (the execution status of this line is deduced): *lastptr = (unsigned short *)last; | - |
201 | #endif | - |
202 | return entrysize; never executed: return entrysize; | 0 |
203 | } | - |
204 | if (c > 0) bot = mid + 1; else top = mid; never executed: bot = mid + 1; never executed: top = mid; never evaluated: c > 0 | 0 |
205 | } | - |
206 | | - |
207 | return PCRE_ERROR_NOSUBSTRING; never executed: return (-7); | 0 |
208 | } | - |
209 | | - |
210 | | - |
211 | | - |
212 | /************************************************* | - |
213 | * Find first set of multiple named strings * | - |
214 | *************************************************/ | - |
215 | | - |
216 | /* This function allows for duplicate names in the table of named substrings. | - |
217 | It returns the number of the first one that was set in a pattern match. | - |
218 | | - |
219 | Arguments: | - |
220 | code the compiled regex | - |
221 | stringname the name of the capturing substring | - |
222 | ovector the vector of matched substrings | - |
223 | | - |
224 | Returns: the number of the first that is set, | - |
225 | or the number of the last one if none are set, | - |
226 | or a negative number on error | - |
227 | */ | - |
228 | | - |
229 | #ifdef COMPILE_PCRE8 | - |
230 | static int | - |
231 | get_first_set(const pcre *code, const char *stringname, int *ovector) | - |
232 | #else | - |
233 | static int | - |
234 | get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector) | - |
235 | #endif | - |
236 | { | - |
237 | const REAL_PCRE *re = (const REAL_PCRE *)code; never executed (the execution status of this line is deduced): const real_pcre16 *re = (const real_pcre16 *)code; | - |
238 | int entrysize; never executed (the execution status of this line is deduced): int entrysize; | - |
239 | pcre_uchar *entry; never executed (the execution status of this line is deduced): pcre_uchar *entry; | - |
240 | #ifdef COMPILE_PCRE8 | - |
241 | char *first, *last; | - |
242 | #else | - |
243 | PCRE_UCHAR16 *first, *last; never executed (the execution status of this line is deduced): unsigned short *first, *last; | - |
244 | #endif | - |
245 | | - |
246 | #ifdef COMPILE_PCRE8 | - |
247 | if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0) | - |
248 | return pcre_get_stringnumber(code, stringname); | - |
249 | entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last); | - |
250 | #else | - |
251 | if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0) never evaluated: (re->options & 0x00080000) == 0 never evaluated: (re->flags & 0x0400) == 0 | 0 |
252 | return pcre16_get_stringnumber(code, stringname); never executed: return pcre16_get_stringnumber(code, stringname); | 0 |
253 | entrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last); never executed (the execution status of this line is deduced): entrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last); | - |
254 | #endif | - |
255 | if (entrysize <= 0) return entrysize; never executed: return entrysize; never evaluated: entrysize <= 0 | 0 |
256 | for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize) never evaluated: entry <= (pcre_uchar *)last | 0 |
257 | { | - |
258 | int n = GET2(entry, 0); never executed (the execution status of this line is deduced): int n = entry[0]; | - |
259 | if (ovector[n*2] >= 0) return n; never executed: return n; never evaluated: ovector[n*2] >= 0 | 0 |
260 | } | 0 |
261 | return GET2(entry, 0); never executed: return entry[0]; | 0 |
262 | } | - |
263 | | - |
264 | | - |
265 | | - |
266 | | - |
267 | /************************************************* | - |
268 | * Copy captured string to given buffer * | - |
269 | *************************************************/ | - |
270 | | - |
271 | /* This function copies a single captured substring into a given buffer. | - |
272 | Note that we use memcpy() rather than strncpy() in case there are binary zeros | - |
273 | in the string. | - |
274 | | - |
275 | Arguments: | - |
276 | subject the subject string that was matched | - |
277 | ovector pointer to the offsets table | - |
278 | stringcount the number of substrings that were captured | - |
279 | (i.e. the yield of the pcre_exec call, unless | - |
280 | that was zero, in which case it should be 1/3 | - |
281 | of the offset table size) | - |
282 | stringnumber the number of the required substring | - |
283 | buffer where to put the substring | - |
284 | size the size of the buffer | - |
285 | | - |
286 | Returns: if successful: | - |
287 | the length of the copied string, not including the zero | - |
288 | that is put on the end; can be zero | - |
289 | if not successful: | - |
290 | PCRE_ERROR_NOMEMORY (-6) buffer too small | - |
291 | PCRE_ERROR_NOSUBSTRING (-7) no such captured substring | - |
292 | */ | - |
293 | | - |
294 | #ifdef COMPILE_PCRE8 | - |
295 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
296 | pcre_copy_substring(const char *subject, int *ovector, int stringcount, | - |
297 | int stringnumber, char *buffer, int size) | - |
298 | #else | - |
299 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
300 | pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount, | - |
301 | int stringnumber, PCRE_UCHAR16 *buffer, int size) | - |
302 | #endif | - |
303 | { | - |
304 | int yield; never executed (the execution status of this line is deduced): int yield; | - |
305 | if (stringnumber < 0 || stringnumber >= stringcount) never evaluated: stringnumber < 0 never evaluated: stringnumber >= stringcount | 0 |
306 | return PCRE_ERROR_NOSUBSTRING; never executed: return (-7); | 0 |
307 | stringnumber *= 2; never executed (the execution status of this line is deduced): stringnumber *= 2; | - |
308 | yield = ovector[stringnumber+1] - ovector[stringnumber]; never executed (the execution status of this line is deduced): yield = ovector[stringnumber+1] - ovector[stringnumber]; | - |
309 | if (size < yield + 1) return PCRE_ERROR_NOMEMORY; never executed: return (-6); never evaluated: size < yield + 1 | 0 |
310 | memcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield)); never executed (the execution status of this line is deduced): memcpy(buffer, subject + ovector[stringnumber], ((yield) << 1)); | - |
311 | buffer[yield] = 0; never executed (the execution status of this line is deduced): buffer[yield] = 0; | - |
312 | return yield; never executed: return yield; | 0 |
313 | } | - |
314 | | - |
315 | | - |
316 | | - |
317 | /************************************************* | - |
318 | * Copy named captured string to given buffer * | - |
319 | *************************************************/ | - |
320 | | - |
321 | /* This function copies a single captured substring into a given buffer, | - |
322 | identifying it by name. If the regex permits duplicate names, the first | - |
323 | substring that is set is chosen. | - |
324 | | - |
325 | Arguments: | - |
326 | code the compiled regex | - |
327 | subject the subject string that was matched | - |
328 | ovector pointer to the offsets table | - |
329 | stringcount the number of substrings that were captured | - |
330 | (i.e. the yield of the pcre_exec call, unless | - |
331 | that was zero, in which case it should be 1/3 | - |
332 | of the offset table size) | - |
333 | stringname the name of the required substring | - |
334 | buffer where to put the substring | - |
335 | size the size of the buffer | - |
336 | | - |
337 | Returns: if successful: | - |
338 | the length of the copied string, not including the zero | - |
339 | that is put on the end; can be zero | - |
340 | if not successful: | - |
341 | PCRE_ERROR_NOMEMORY (-6) buffer too small | - |
342 | PCRE_ERROR_NOSUBSTRING (-7) no such captured substring | - |
343 | */ | - |
344 | | - |
345 | #ifdef COMPILE_PCRE8 | - |
346 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
347 | pcre_copy_named_substring(const pcre *code, const char *subject, | - |
348 | int *ovector, int stringcount, const char *stringname, | - |
349 | char *buffer, int size) | - |
350 | #else | - |
351 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
352 | pcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject, | - |
353 | int *ovector, int stringcount, PCRE_SPTR16 stringname, | - |
354 | PCRE_UCHAR16 *buffer, int size) | - |
355 | #endif | - |
356 | { | - |
357 | int n = get_first_set(code, stringname, ovector); never executed (the execution status of this line is deduced): int n = get_first_set(code, stringname, ovector); | - |
358 | if (n <= 0) return n; never executed: return n; never evaluated: n <= 0 | 0 |
359 | #ifdef COMPILE_PCRE8 | - |
360 | return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); | - |
361 | #else | - |
362 | return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size); never executed: return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size); | 0 |
363 | #endif | - |
364 | } | - |
365 | | - |
366 | | - |
367 | | - |
368 | /************************************************* | - |
369 | * Copy all captured strings to new store * | - |
370 | *************************************************/ | - |
371 | | - |
372 | /* This function gets one chunk of store and builds a list of pointers and all | - |
373 | of the captured substrings in it. A NULL pointer is put on the end of the list. | - |
374 | | - |
375 | Arguments: | - |
376 | subject the subject string that was matched | - |
377 | ovector pointer to the offsets table | - |
378 | stringcount the number of substrings that were captured | - |
379 | (i.e. the yield of the pcre_exec call, unless | - |
380 | that was zero, in which case it should be 1/3 | - |
381 | of the offset table size) | - |
382 | listptr set to point to the list of pointers | - |
383 | | - |
384 | Returns: if successful: 0 | - |
385 | if not successful: | - |
386 | PCRE_ERROR_NOMEMORY (-6) failed to get store | - |
387 | */ | - |
388 | | - |
389 | #ifdef COMPILE_PCRE8 | - |
390 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
391 | pcre_get_substring_list(const char *subject, int *ovector, int stringcount, | - |
392 | const char ***listptr) | - |
393 | #else | - |
394 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
395 | pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount, | - |
396 | PCRE_SPTR16 **listptr) | - |
397 | #endif | - |
398 | { | - |
399 | int i; never executed (the execution status of this line is deduced): int i; | - |
400 | int size = sizeof(pcre_uchar *); never executed (the execution status of this line is deduced): int size = sizeof(pcre_uchar *); | - |
401 | int double_count = stringcount * 2; never executed (the execution status of this line is deduced): int double_count = stringcount * 2; | - |
402 | pcre_uchar **stringlist; never executed (the execution status of this line is deduced): pcre_uchar **stringlist; | - |
403 | pcre_uchar *p; never executed (the execution status of this line is deduced): pcre_uchar *p; | - |
404 | | - |
405 | for (i = 0; i < double_count; i += 2) never evaluated: i < double_count | 0 |
406 | size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1); never executed: size += sizeof(pcre_uchar *) + ((ovector[i+1] - ovector[i] + 1) << 1); | 0 |
407 | | - |
408 | stringlist = (pcre_uchar **)(PUBL(malloc))(size); never executed (the execution status of this line is deduced): stringlist = (pcre_uchar **)(pcre16_malloc)(size); | - |
409 | if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; never executed: return (-6); never evaluated: stringlist == ((void *)0) | 0 |
410 | | - |
411 | #ifdef COMPILE_PCRE8 | - |
412 | *listptr = (const char **)stringlist; | - |
413 | #else | - |
414 | *listptr = (PCRE_SPTR16 *)stringlist; never executed (the execution status of this line is deduced): *listptr = (const unsigned short * *)stringlist; | - |
415 | #endif | - |
416 | p = (pcre_uchar *)(stringlist + stringcount + 1); never executed (the execution status of this line is deduced): p = (pcre_uchar *)(stringlist + stringcount + 1); | - |
417 | | - |
418 | for (i = 0; i < double_count; i += 2) never evaluated: i < double_count | 0 |
419 | { | - |
420 | int len = ovector[i+1] - ovector[i]; never executed (the execution status of this line is deduced): int len = ovector[i+1] - ovector[i]; | - |
421 | memcpy(p, subject + ovector[i], IN_UCHARS(len)); never executed (the execution status of this line is deduced): memcpy(p, subject + ovector[i], ((len) << 1)); | - |
422 | *stringlist++ = p; never executed (the execution status of this line is deduced): *stringlist++ = p; | - |
423 | p += len; never executed (the execution status of this line is deduced): p += len; | - |
424 | *p++ = 0; never executed (the execution status of this line is deduced): *p++ = 0; | - |
425 | } | 0 |
426 | | - |
427 | *stringlist = NULL; never executed (the execution status of this line is deduced): *stringlist = ((void *)0); | - |
428 | return 0; never executed: return 0; | 0 |
429 | } | - |
430 | | - |
431 | | - |
432 | | - |
433 | /************************************************* | - |
434 | * Free store obtained by get_substring_list * | - |
435 | *************************************************/ | - |
436 | | - |
437 | /* This function exists for the benefit of people calling PCRE from non-C | - |
438 | programs that can call its functions, but not free() or (PUBL(free))() | - |
439 | directly. | - |
440 | | - |
441 | Argument: the result of a previous pcre_get_substring_list() | - |
442 | Returns: nothing | - |
443 | */ | - |
444 | | - |
445 | #ifdef COMPILE_PCRE8 | - |
446 | PCRE_EXP_DEFN void PCRE_CALL_CONVENTION | - |
447 | pcre_free_substring_list(const char **pointer) | - |
448 | #else | - |
449 | PCRE_EXP_DEFN void PCRE_CALL_CONVENTION | - |
450 | pcre16_free_substring_list(PCRE_SPTR16 *pointer) | - |
451 | #endif | - |
452 | { | - |
453 | (PUBL(free))((void *)pointer); never executed (the execution status of this line is deduced): (pcre16_free)((void *)pointer); | - |
454 | } | 0 |
455 | | - |
456 | | - |
457 | | - |
458 | /************************************************* | - |
459 | * Copy captured string to new store * | - |
460 | *************************************************/ | - |
461 | | - |
462 | /* This function copies a single captured substring into a piece of new | - |
463 | store | - |
464 | | - |
465 | Arguments: | - |
466 | subject the subject string that was matched | - |
467 | ovector pointer to the offsets table | - |
468 | stringcount the number of substrings that were captured | - |
469 | (i.e. the yield of the pcre_exec call, unless | - |
470 | that was zero, in which case it should be 1/3 | - |
471 | of the offset table size) | - |
472 | stringnumber the number of the required substring | - |
473 | stringptr where to put a pointer to the substring | - |
474 | | - |
475 | Returns: if successful: | - |
476 | the length of the string, not including the zero that | - |
477 | is put on the end; can be zero | - |
478 | if not successful: | - |
479 | PCRE_ERROR_NOMEMORY (-6) failed to get store | - |
480 | PCRE_ERROR_NOSUBSTRING (-7) substring not present | - |
481 | */ | - |
482 | | - |
483 | #ifdef COMPILE_PCRE8 | - |
484 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
485 | pcre_get_substring(const char *subject, int *ovector, int stringcount, | - |
486 | int stringnumber, const char **stringptr) | - |
487 | #else | - |
488 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
489 | pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount, | - |
490 | int stringnumber, PCRE_SPTR16 *stringptr) | - |
491 | #endif | - |
492 | { | - |
493 | int yield; never executed (the execution status of this line is deduced): int yield; | - |
494 | pcre_uchar *substring; never executed (the execution status of this line is deduced): pcre_uchar *substring; | - |
495 | if (stringnumber < 0 || stringnumber >= stringcount) never evaluated: stringnumber < 0 never evaluated: stringnumber >= stringcount | 0 |
496 | return PCRE_ERROR_NOSUBSTRING; never executed: return (-7); | 0 |
497 | stringnumber *= 2; never executed (the execution status of this line is deduced): stringnumber *= 2; | - |
498 | yield = ovector[stringnumber+1] - ovector[stringnumber]; never executed (the execution status of this line is deduced): yield = ovector[stringnumber+1] - ovector[stringnumber]; | - |
499 | substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1)); never executed (the execution status of this line is deduced): substring = (pcre_uchar *)(pcre16_malloc)(((yield + 1) << 1)); | - |
500 | if (substring == NULL) return PCRE_ERROR_NOMEMORY; never executed: return (-6); never evaluated: substring == ((void *)0) | 0 |
501 | memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield)); never executed (the execution status of this line is deduced): memcpy(substring, subject + ovector[stringnumber], ((yield) << 1)); | - |
502 | substring[yield] = 0; never executed (the execution status of this line is deduced): substring[yield] = 0; | - |
503 | #ifdef COMPILE_PCRE8 | - |
504 | *stringptr = (const char *)substring; | - |
505 | #else | - |
506 | *stringptr = (PCRE_SPTR16)substring; never executed (the execution status of this line is deduced): *stringptr = (const unsigned short *)substring; | - |
507 | #endif | - |
508 | return yield; never executed: return yield; | 0 |
509 | } | - |
510 | | - |
511 | | - |
512 | | - |
513 | /************************************************* | - |
514 | * Copy named captured string to new store * | - |
515 | *************************************************/ | - |
516 | | - |
517 | /* This function copies a single captured substring, identified by name, into | - |
518 | new store. If the regex permits duplicate names, the first substring that is | - |
519 | set is chosen. | - |
520 | | - |
521 | Arguments: | - |
522 | code the compiled regex | - |
523 | subject the subject string that was matched | - |
524 | ovector pointer to the offsets table | - |
525 | stringcount the number of substrings that were captured | - |
526 | (i.e. the yield of the pcre_exec call, unless | - |
527 | that was zero, in which case it should be 1/3 | - |
528 | of the offset table size) | - |
529 | stringname the name of the required substring | - |
530 | stringptr where to put the pointer | - |
531 | | - |
532 | Returns: if successful: | - |
533 | the length of the copied string, not including the zero | - |
534 | that is put on the end; can be zero | - |
535 | if not successful: | - |
536 | PCRE_ERROR_NOMEMORY (-6) couldn't get memory | - |
537 | PCRE_ERROR_NOSUBSTRING (-7) no such captured substring | - |
538 | */ | - |
539 | | - |
540 | #ifdef COMPILE_PCRE8 | - |
541 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
542 | pcre_get_named_substring(const pcre *code, const char *subject, | - |
543 | int *ovector, int stringcount, const char *stringname, | - |
544 | const char **stringptr) | - |
545 | #else | - |
546 | PCRE_EXP_DEFN int PCRE_CALL_CONVENTION | - |
547 | pcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject, | - |
548 | int *ovector, int stringcount, PCRE_SPTR16 stringname, | - |
549 | PCRE_SPTR16 *stringptr) | - |
550 | #endif | - |
551 | { | - |
552 | int n = get_first_set(code, stringname, ovector); never executed (the execution status of this line is deduced): int n = get_first_set(code, stringname, ovector); | - |
553 | if (n <= 0) return n; never executed: return n; never evaluated: n <= 0 | 0 |
554 | #ifdef COMPILE_PCRE8 | - |
555 | return pcre_get_substring(subject, ovector, stringcount, n, stringptr); | - |
556 | #else | - |
557 | return pcre16_get_substring(subject, ovector, stringcount, n, stringptr); never executed: return pcre16_get_substring(subject, ovector, stringcount, n, stringptr); | 0 |
558 | #endif | - |
559 | } | - |
560 | | - |
561 | | - |
562 | | - |
563 | | - |
564 | /************************************************* | - |
565 | * Free store obtained by get_substring * | - |
566 | *************************************************/ | - |
567 | | - |
568 | /* This function exists for the benefit of people calling PCRE from non-C | - |
569 | programs that can call its functions, but not free() or (PUBL(free))() | - |
570 | directly. | - |
571 | | - |
572 | Argument: the result of a previous pcre_get_substring() | - |
573 | Returns: nothing | - |
574 | */ | - |
575 | | - |
576 | #ifdef COMPILE_PCRE8 | - |
577 | PCRE_EXP_DEFN void PCRE_CALL_CONVENTION | - |
578 | pcre_free_substring(const char *pointer) | - |
579 | #else | - |
580 | PCRE_EXP_DEFN void PCRE_CALL_CONVENTION | - |
581 | pcre16_free_substring(PCRE_SPTR16 pointer) | - |
582 | #endif | - |
583 | { | - |
584 | (PUBL(free))((void *)pointer); never executed (the execution status of this line is deduced): (pcre16_free)((void *)pointer); | - |
585 | } | 0 |
586 | | - |
587 | /* End of pcre_get.c */ | - |
588 | | - |
| | |