Annotation of parser3/src/lib/pcre/get.c, revision 1.1.14.1
1.1 paf 1: /*************************************************
2: * Perl-Compatible Regular Expressions *
3: *************************************************/
4:
5: /*
6: This is a library of functions to support regular expressions whose syntax
7: and semantics are as close as possible to those of the Perl 5 language. See
8: the file Tech.Notes for some information on the internals.
9:
10: Written by: Philip Hazel <ph10@cam.ac.uk>
11:
12: Copyright (c) 1997-1999 University of Cambridge
13:
14: -----------------------------------------------------------------------------
15: Permission is granted to anyone to use this software for any purpose on any
16: computer system, and to redistribute it freely, subject to the following
17: restrictions:
18:
19: 1. This software is distributed in the hope that it will be useful,
20: but WITHOUT ANY WARRANTY; without even the implied warranty of
21: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22:
23: 2. The origin of this software must not be misrepresented, either by
24: explicit claim or by omission.
25:
26: 3. Altered versions must be plainly marked as such, and must not be
27: misrepresented as being the original software.
28:
29: 4. If PCRE is embedded in any software that is released under the GNU
30: General Purpose Licence (GPL), then the terms of that licence shall
31: supersede any condition above with which it is incompatible.
32: -----------------------------------------------------------------------------
33: */
34:
35: /* This module contains some convenience functions for extracting substrings
36: from the subject string after a regex match has succeeded. The original idea
37: for these functions came from Scott Wimer <scottw@cgibuilder.com>. */
38:
39:
40: /* Include the internals header, which itself includes Standard C headers plus
41: the external pcre header. */
42:
43: #include "internal.h"
44:
45:
46:
47: /*************************************************
48: * Copy captured string to given buffer *
49: *************************************************/
50:
51: /* This function copies a single captured substring into a given buffer.
52: Note that we use memcpy() rather than strncpy() in case there are binary zeros
53: in the string.
54:
55: Arguments:
56: subject the subject string that was matched
57: ovector pointer to the offsets table
58: stringcount the number of substrings that were captured
59: (i.e. the yield of the pcre_exec call, unless
60: that was zero, in which case it should be 1/3
61: of the offset table size)
62: stringnumber the number of the required substring
63: buffer where to put the substring
64: size the size of the buffer
65:
66: Returns: if successful:
67: the length of the copied string, not including the zero
68: that is put on the end; can be zero
69: if not successful:
70: PCRE_ERROR_NOMEMORY (-6) buffer too small
71: PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
72: */
73:
74: int
1.1.14.1! paf 75: pcre_copy_substring(const char* subject, int *ovector, int stringcount,
1.1 paf 76: int stringnumber, char *buffer, int size)
77: {
78: int yield;
79: if (stringnumber < 0 || stringnumber >= stringcount)
80: return PCRE_ERROR_NOSUBSTRING;
81: stringnumber *= 2;
82: yield = ovector[stringnumber+1] - ovector[stringnumber];
83: if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
84: memcpy(buffer, subject + ovector[stringnumber], yield);
85: buffer[yield] = 0;
86: return yield;
87: }
88:
89:
90:
91: /*************************************************
92: * Copy all captured strings to new store *
93: *************************************************/
94:
95: /* This function gets one chunk of store and builds a list of pointers and all
96: of the captured substrings in it. A NULL pointer is put on the end of the list.
97:
98: Arguments:
99: subject the subject string that was matched
100: ovector pointer to the offsets table
101: stringcount the number of substrings that were captured
102: (i.e. the yield of the pcre_exec call, unless
103: that was zero, in which case it should be 1/3
104: of the offset table size)
105: listptr set to point to the list of pointers
106:
107: Returns: if successful: 0
108: if not successful:
109: PCRE_ERROR_NOMEMORY (-6) failed to get store
110: */
111:
112: int
1.1.14.1! paf 113: pcre_get_substring_list(const char* subject, int *ovector, int stringcount,
! 114: const char* **listptr)
1.1 paf 115: {
116: int i;
117: int size = sizeof(char *);
118: int double_count = stringcount * 2;
119: char **stringlist;
120: char *p;
121:
122: for (i = 0; i < double_count; i += 2)
123: size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
124:
125: stringlist = (char **)(pcre_malloc)(size);
126: if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
127:
1.1.14.1! paf 128: *listptr = (const char* *)stringlist;
1.1 paf 129: p = (char *)(stringlist + stringcount + 1);
130:
131: for (i = 0; i < double_count; i += 2)
132: {
133: int len = ovector[i+1] - ovector[i];
134: memcpy(p, subject + ovector[i], len);
135: *stringlist++ = p;
136: p += len;
137: *p++ = 0;
138: }
139:
140: *stringlist = NULL;
141: return 0;
142: }
143:
144:
145:
146: /*************************************************
147: * Copy captured string to new store *
148: *************************************************/
149:
150: /* This function copies a single captured substring into a piece of new
151: store
152:
153: Arguments:
154: subject the subject string that was matched
155: ovector pointer to the offsets table
156: stringcount the number of substrings that were captured
157: (i.e. the yield of the pcre_exec call, unless
158: that was zero, in which case it should be 1/3
159: of the offset table size)
160: stringnumber the number of the required substring
161: stringptr where to put a pointer to the substring
162:
163: Returns: if successful:
164: the length of the string, not including the zero that
165: is put on the end; can be zero
166: if not successful:
167: PCRE_ERROR_NOMEMORY (-6) failed to get store
168: PCRE_ERROR_NOSUBSTRING (-7) substring not present
169: */
170:
171: int
1.1.14.1! paf 172: pcre_get_substring(const char* subject, int *ovector, int stringcount,
! 173: int stringnumber, const char* *stringptr)
1.1 paf 174: {
175: int yield;
176: char *substring;
177: if (stringnumber < 0 || stringnumber >= stringcount)
178: return PCRE_ERROR_NOSUBSTRING;
179: stringnumber *= 2;
180: yield = ovector[stringnumber+1] - ovector[stringnumber];
181: substring = (char *)(pcre_malloc)(yield + 1);
182: if (substring == NULL) return PCRE_ERROR_NOMEMORY;
183: memcpy(substring, subject + ovector[stringnumber], yield);
184: substring[yield] = 0;
185: *stringptr = substring;
186: return yield;
187: }
188:
189: /* End of get.c */
E-mail: