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