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