xref: /PHP-7.0/ext/pcre/pcrelib/pcre_get.c (revision 5f9df47e)
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 #include "config.h"
47 
48 #include "pcre_internal.h"
49 
50 
51 /*************************************************
52 *           Find number for named string         *
53 *************************************************/
54 
55 /* This function is used by the get_first_set() function below, as well
56 as being generally available. It assumes that names are unique.
57 
58 Arguments:
59   code        the compiled regex
60   stringname  the name whose number is required
61 
62 Returns:      the number of the named parentheses, or a negative number
63                 (PCRE_ERROR_NOSUBSTRING) if not found
64 */
65 
66 #if defined COMPILE_PCRE8
67 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
pcre_get_stringnumber(const pcre * code,const char * stringname)68 pcre_get_stringnumber(const pcre *code, const char *stringname)
69 #elif defined COMPILE_PCRE16
70 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
71 pcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname)
72 #elif defined COMPILE_PCRE32
73 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
74 pcre32_get_stringnumber(const pcre32 *code, PCRE_SPTR32 stringname)
75 #endif
76 {
77 int rc;
78 int entrysize;
79 int top, bot;
80 pcre_uchar *nametable;
81 
82 #ifdef COMPILE_PCRE8
83 if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
84   return rc;
85 if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
86 
87 if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
88   return rc;
89 if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
90   return rc;
91 #endif
92 #ifdef COMPILE_PCRE16
93 if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
94   return rc;
95 if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
96 
97 if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
98   return rc;
99 if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
100   return rc;
101 #endif
102 #ifdef COMPILE_PCRE32
103 if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
104   return rc;
105 if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
106 
107 if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
108   return rc;
109 if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
110   return rc;
111 #endif
112 
113 bot = 0;
114 while (top > bot)
115   {
116   int mid = (top + bot) / 2;
117   pcre_uchar *entry = nametable + entrysize*mid;
118   int c = STRCMP_UC_UC((pcre_uchar *)stringname,
119     (pcre_uchar *)(entry + IMM2_SIZE));
120   if (c == 0) return GET2(entry, 0);
121   if (c > 0) bot = mid + 1; else top = mid;
122   }
123 
124 return PCRE_ERROR_NOSUBSTRING;
125 }
126 
127 
128 
129 /*************************************************
130 *     Find (multiple) entries for named string   *
131 *************************************************/
132 
133 /* This is used by the get_first_set() function below, as well as being
134 generally available. It is used when duplicated names are permitted.
135 
136 Arguments:
137   code        the compiled regex
138   stringname  the name whose entries required
139   firstptr    where to put the pointer to the first entry
140   lastptr     where to put the pointer to the last entry
141 
142 Returns:      the length of each entry, or a negative number
143                 (PCRE_ERROR_NOSUBSTRING) if not found
144 */
145 
146 #if defined COMPILE_PCRE8
147 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
pcre_get_stringtable_entries(const pcre * code,const char * stringname,char ** firstptr,char ** lastptr)148 pcre_get_stringtable_entries(const pcre *code, const char *stringname,
149   char **firstptr, char **lastptr)
150 #elif defined COMPILE_PCRE16
151 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
152 pcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname,
153   PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr)
154 #elif defined COMPILE_PCRE32
155 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
156 pcre32_get_stringtable_entries(const pcre32 *code, PCRE_SPTR32 stringname,
157   PCRE_UCHAR32 **firstptr, PCRE_UCHAR32 **lastptr)
158 #endif
159 {
160 int rc;
161 int entrysize;
162 int top, bot;
163 pcre_uchar *nametable, *lastentry;
164 
165 #ifdef COMPILE_PCRE8
166 if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
167   return rc;
168 if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
169 
170 if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
171   return rc;
172 if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
173   return rc;
174 #endif
175 #ifdef COMPILE_PCRE16
176 if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
177   return rc;
178 if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
179 
180 if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
181   return rc;
182 if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
183   return rc;
184 #endif
185 #ifdef COMPILE_PCRE32
186 if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
187   return rc;
188 if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
189 
190 if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
191   return rc;
192 if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
193   return rc;
194 #endif
195 
196 lastentry = nametable + entrysize * (top - 1);
197 bot = 0;
198 while (top > bot)
199   {
200   int mid = (top + bot) / 2;
201   pcre_uchar *entry = nametable + entrysize*mid;
202   int c = STRCMP_UC_UC((pcre_uchar *)stringname,
203     (pcre_uchar *)(entry + IMM2_SIZE));
204   if (c == 0)
205     {
206     pcre_uchar *first = entry;
207     pcre_uchar *last = entry;
208     while (first > nametable)
209       {
210       if (STRCMP_UC_UC((pcre_uchar *)stringname,
211         (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break;
212       first -= entrysize;
213       }
214     while (last < lastentry)
215       {
216       if (STRCMP_UC_UC((pcre_uchar *)stringname,
217         (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break;
218       last += entrysize;
219       }
220 #if defined COMPILE_PCRE8
221     *firstptr = (char *)first;
222     *lastptr = (char *)last;
223 #elif defined COMPILE_PCRE16
224     *firstptr = (PCRE_UCHAR16 *)first;
225     *lastptr = (PCRE_UCHAR16 *)last;
226 #elif defined COMPILE_PCRE32
227     *firstptr = (PCRE_UCHAR32 *)first;
228     *lastptr = (PCRE_UCHAR32 *)last;
229 #endif
230     return entrysize;
231     }
232   if (c > 0) bot = mid + 1; else top = mid;
233   }
234 
235 return PCRE_ERROR_NOSUBSTRING;
236 }
237 
238 
239 
240 /*************************************************
241 *    Find first set of multiple named strings    *
242 *************************************************/
243 
244 /* This function allows for duplicate names in the table of named substrings.
245 It returns the number of the first one that was set in a pattern match.
246 
247 Arguments:
248   code         the compiled regex
249   stringname   the name of the capturing substring
250   ovector      the vector of matched substrings
251 
252 Returns:       the number of the first that is set,
253                or the number of the last one if none are set,
254                or a negative number on error
255 */
256 
257 #if defined COMPILE_PCRE8
258 static int
get_first_set(const pcre * code,const char * stringname,int * ovector)259 get_first_set(const pcre *code, const char *stringname, int *ovector)
260 #elif defined COMPILE_PCRE16
261 static int
262 get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector)
263 #elif defined COMPILE_PCRE32
264 static int
265 get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector)
266 #endif
267 {
268 const REAL_PCRE *re = (const REAL_PCRE *)code;
269 int entrysize;
270 pcre_uchar *entry;
271 #if defined COMPILE_PCRE8
272 char *first, *last;
273 #elif defined COMPILE_PCRE16
274 PCRE_UCHAR16 *first, *last;
275 #elif defined COMPILE_PCRE32
276 PCRE_UCHAR32 *first, *last;
277 #endif
278 
279 #if defined COMPILE_PCRE8
280 if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
281   return pcre_get_stringnumber(code, stringname);
282 entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);
283 #elif defined COMPILE_PCRE16
284 if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
285   return pcre16_get_stringnumber(code, stringname);
286 entrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last);
287 #elif defined COMPILE_PCRE32
288 if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
289   return pcre32_get_stringnumber(code, stringname);
290 entrysize = pcre32_get_stringtable_entries(code, stringname, &first, &last);
291 #endif
292 if (entrysize <= 0) return entrysize;
293 for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)
294   {
295   int n = GET2(entry, 0);
296   if (ovector[n*2] >= 0) return n;
297   }
298 return GET2(entry, 0);
299 }
300 
301 
302 
303 
304 /*************************************************
305 *      Copy captured string to given buffer      *
306 *************************************************/
307 
308 /* This function copies a single captured substring into a given buffer.
309 Note that we use memcpy() rather than strncpy() in case there are binary zeros
310 in the string.
311 
312 Arguments:
313   subject        the subject string that was matched
314   ovector        pointer to the offsets table
315   stringcount    the number of substrings that were captured
316                    (i.e. the yield of the pcre_exec call, unless
317                    that was zero, in which case it should be 1/3
318                    of the offset table size)
319   stringnumber   the number of the required substring
320   buffer         where to put the substring
321   size           the size of the buffer
322 
323 Returns:         if successful:
324                    the length of the copied string, not including the zero
325                    that is put on the end; can be zero
326                  if not successful:
327                    PCRE_ERROR_NOMEMORY (-6) buffer too small
328                    PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
329 */
330 
331 #if defined COMPILE_PCRE8
332 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
pcre_copy_substring(const char * subject,int * ovector,int stringcount,int stringnumber,char * buffer,int size)333 pcre_copy_substring(const char *subject, int *ovector, int stringcount,
334   int stringnumber, char *buffer, int size)
335 #elif defined COMPILE_PCRE16
336 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
337 pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
338   int stringnumber, PCRE_UCHAR16 *buffer, int size)
339 #elif defined COMPILE_PCRE32
340 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
341 pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
342   int stringnumber, PCRE_UCHAR32 *buffer, int size)
343 #endif
344 {
345 int yield;
346 if (stringnumber < 0 || stringnumber >= stringcount)
347   return PCRE_ERROR_NOSUBSTRING;
348 stringnumber *= 2;
349 yield = ovector[stringnumber+1] - ovector[stringnumber];
350 if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
351 memcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield));
352 buffer[yield] = 0;
353 return yield;
354 }
355 
356 
357 
358 /*************************************************
359 *   Copy named captured string to given buffer   *
360 *************************************************/
361 
362 /* This function copies a single captured substring into a given buffer,
363 identifying it by name. If the regex permits duplicate names, the first
364 substring that is set is chosen.
365 
366 Arguments:
367   code           the compiled regex
368   subject        the subject string that was matched
369   ovector        pointer to the offsets table
370   stringcount    the number of substrings that were captured
371                    (i.e. the yield of the pcre_exec call, unless
372                    that was zero, in which case it should be 1/3
373                    of the offset table size)
374   stringname     the name of the required substring
375   buffer         where to put the substring
376   size           the size of the buffer
377 
378 Returns:         if successful:
379                    the length of the copied string, not including the zero
380                    that is put on the end; can be zero
381                  if not successful:
382                    PCRE_ERROR_NOMEMORY (-6) buffer too small
383                    PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
384 */
385 
386 #if defined COMPILE_PCRE8
387 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
pcre_copy_named_substring(const pcre * code,const char * subject,int * ovector,int stringcount,const char * stringname,char * buffer,int size)388 pcre_copy_named_substring(const pcre *code, const char *subject,
389   int *ovector, int stringcount, const char *stringname,
390   char *buffer, int size)
391 #elif defined COMPILE_PCRE16
392 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
393 pcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
394   int *ovector, int stringcount, PCRE_SPTR16 stringname,
395   PCRE_UCHAR16 *buffer, int size)
396 #elif defined COMPILE_PCRE32
397 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
398 pcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
399   int *ovector, int stringcount, PCRE_SPTR32 stringname,
400   PCRE_UCHAR32 *buffer, int size)
401 #endif
402 {
403 int n = get_first_set(code, stringname, ovector);
404 if (n <= 0) return n;
405 #if defined COMPILE_PCRE8
406 return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
407 #elif defined COMPILE_PCRE16
408 return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size);
409 #elif defined COMPILE_PCRE32
410 return pcre32_copy_substring(subject, ovector, stringcount, n, buffer, size);
411 #endif
412 }
413 
414 
415 
416 /*************************************************
417 *      Copy all captured strings to new store    *
418 *************************************************/
419 
420 /* This function gets one chunk of store and builds a list of pointers and all
421 of the captured substrings in it. A NULL pointer is put on the end of the list.
422 
423 Arguments:
424   subject        the subject string that was matched
425   ovector        pointer to the offsets table
426   stringcount    the number of substrings that were captured
427                    (i.e. the yield of the pcre_exec call, unless
428                    that was zero, in which case it should be 1/3
429                    of the offset table size)
430   listptr        set to point to the list of pointers
431 
432 Returns:         if successful: 0
433                  if not successful:
434                    PCRE_ERROR_NOMEMORY (-6) failed to get store
435 */
436 
437 #if defined COMPILE_PCRE8
438 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
pcre_get_substring_list(const char * subject,int * ovector,int stringcount,const char *** listptr)439 pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
440   const char ***listptr)
441 #elif defined COMPILE_PCRE16
442 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
443 pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount,
444   PCRE_SPTR16 **listptr)
445 #elif defined COMPILE_PCRE32
446 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
447 pcre32_get_substring_list(PCRE_SPTR32 subject, int *ovector, int stringcount,
448   PCRE_SPTR32 **listptr)
449 #endif
450 {
451 int i;
452 int size = sizeof(pcre_uchar *);
453 int double_count = stringcount * 2;
454 pcre_uchar **stringlist;
455 pcre_uchar *p;
456 
457 for (i = 0; i < double_count; i += 2)
458   size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1);
459 
460 stringlist = (pcre_uchar **)(PUBL(malloc))(size);
461 if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
462 
463 #if defined COMPILE_PCRE8
464 *listptr = (const char **)stringlist;
465 #elif defined COMPILE_PCRE16
466 *listptr = (PCRE_SPTR16 *)stringlist;
467 #elif defined COMPILE_PCRE32
468 *listptr = (PCRE_SPTR32 *)stringlist;
469 #endif
470 p = (pcre_uchar *)(stringlist + stringcount + 1);
471 
472 for (i = 0; i < double_count; i += 2)
473   {
474   int len = ovector[i+1] - ovector[i];
475   memcpy(p, subject + ovector[i], IN_UCHARS(len));
476   *stringlist++ = p;
477   p += len;
478   *p++ = 0;
479   }
480 
481 *stringlist = NULL;
482 return 0;
483 }
484 
485 
486 
487 /*************************************************
488 *   Free store obtained by get_substring_list    *
489 *************************************************/
490 
491 /* This function exists for the benefit of people calling PCRE from non-C
492 programs that can call its functions, but not free() or (PUBL(free))()
493 directly.
494 
495 Argument:   the result of a previous pcre_get_substring_list()
496 Returns:    nothing
497 */
498 
499 #if defined COMPILE_PCRE8
500 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
pcre_free_substring_list(const char ** pointer)501 pcre_free_substring_list(const char **pointer)
502 #elif defined COMPILE_PCRE16
503 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
504 pcre16_free_substring_list(PCRE_SPTR16 *pointer)
505 #elif defined COMPILE_PCRE32
506 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
507 pcre32_free_substring_list(PCRE_SPTR32 *pointer)
508 #endif
509 {
510 (PUBL(free))((void *)pointer);
511 }
512 
513 
514 
515 /*************************************************
516 *      Copy captured string to new store         *
517 *************************************************/
518 
519 /* This function copies a single captured substring into a piece of new
520 store
521 
522 Arguments:
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   stringnumber   the number of the required substring
530   stringptr      where to put a pointer to the substring
531 
532 Returns:         if successful:
533                    the length of the string, not including the zero that
534                    is put on the end; can be zero
535                  if not successful:
536                    PCRE_ERROR_NOMEMORY (-6) failed to get store
537                    PCRE_ERROR_NOSUBSTRING (-7) substring not present
538 */
539 
540 #if defined COMPILE_PCRE8
541 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
pcre_get_substring(const char * subject,int * ovector,int stringcount,int stringnumber,const char ** stringptr)542 pcre_get_substring(const char *subject, int *ovector, int stringcount,
543   int stringnumber, const char **stringptr)
544 #elif defined COMPILE_PCRE16
545 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
546 pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
547   int stringnumber, PCRE_SPTR16 *stringptr)
548 #elif defined COMPILE_PCRE32
549 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
550 pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
551   int stringnumber, PCRE_SPTR32 *stringptr)
552 #endif
553 {
554 int yield;
555 pcre_uchar *substring;
556 if (stringnumber < 0 || stringnumber >= stringcount)
557   return PCRE_ERROR_NOSUBSTRING;
558 stringnumber *= 2;
559 yield = ovector[stringnumber+1] - ovector[stringnumber];
560 substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1));
561 if (substring == NULL) return PCRE_ERROR_NOMEMORY;
562 memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield));
563 substring[yield] = 0;
564 #if defined COMPILE_PCRE8
565 *stringptr = (const char *)substring;
566 #elif defined COMPILE_PCRE16
567 *stringptr = (PCRE_SPTR16)substring;
568 #elif defined COMPILE_PCRE32
569 *stringptr = (PCRE_SPTR32)substring;
570 #endif
571 return yield;
572 }
573 
574 
575 
576 /*************************************************
577 *   Copy named captured string to new store      *
578 *************************************************/
579 
580 /* This function copies a single captured substring, identified by name, into
581 new store. If the regex permits duplicate names, the first substring that is
582 set is chosen.
583 
584 Arguments:
585   code           the compiled regex
586   subject        the subject string that was matched
587   ovector        pointer to the offsets table
588   stringcount    the number of substrings that were captured
589                    (i.e. the yield of the pcre_exec call, unless
590                    that was zero, in which case it should be 1/3
591                    of the offset table size)
592   stringname     the name of the required substring
593   stringptr      where to put the pointer
594 
595 Returns:         if successful:
596                    the length of the copied string, not including the zero
597                    that is put on the end; can be zero
598                  if not successful:
599                    PCRE_ERROR_NOMEMORY (-6) couldn't get memory
600                    PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
601 */
602 
603 #if defined COMPILE_PCRE8
604 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
pcre_get_named_substring(const pcre * code,const char * subject,int * ovector,int stringcount,const char * stringname,const char ** stringptr)605 pcre_get_named_substring(const pcre *code, const char *subject,
606   int *ovector, int stringcount, const char *stringname,
607   const char **stringptr)
608 #elif defined COMPILE_PCRE16
609 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
610 pcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
611   int *ovector, int stringcount, PCRE_SPTR16 stringname,
612   PCRE_SPTR16 *stringptr)
613 #elif defined COMPILE_PCRE32
614 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
615 pcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
616   int *ovector, int stringcount, PCRE_SPTR32 stringname,
617   PCRE_SPTR32 *stringptr)
618 #endif
619 {
620 int n = get_first_set(code, stringname, ovector);
621 if (n <= 0) return n;
622 #if defined COMPILE_PCRE8
623 return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
624 #elif defined COMPILE_PCRE16
625 return pcre16_get_substring(subject, ovector, stringcount, n, stringptr);
626 #elif defined COMPILE_PCRE32
627 return pcre32_get_substring(subject, ovector, stringcount, n, stringptr);
628 #endif
629 }
630 
631 
632 
633 
634 /*************************************************
635 *       Free store obtained by get_substring     *
636 *************************************************/
637 
638 /* This function exists for the benefit of people calling PCRE from non-C
639 programs that can call its functions, but not free() or (PUBL(free))()
640 directly.
641 
642 Argument:   the result of a previous pcre_get_substring()
643 Returns:    nothing
644 */
645 
646 #if defined COMPILE_PCRE8
647 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
pcre_free_substring(const char * pointer)648 pcre_free_substring(const char *pointer)
649 #elif defined COMPILE_PCRE16
650 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
651 pcre16_free_substring(PCRE_SPTR16 pointer)
652 #elif defined COMPILE_PCRE32
653 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
654 pcre32_free_substring(PCRE_SPTR32 pointer)
655 #endif
656 {
657 (PUBL(free))((void *)pointer);
658 }
659 
660 /* End of pcre_get.c */
661