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 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 #if defined COMPILE_PCRE8 69 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 70 pcre_get_stringnumber(const pcre *code, const char *stringname) 71 #elif defined COMPILE_PCRE16 72 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 73 pcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname) 74 #elif defined COMPILE_PCRE32 75 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 76 pcre32_get_stringnumber(const pcre32 *code, PCRE_SPTR32 stringname) 77 #endif 78 { 79 int rc; 80 int entrysize; 81 int top, bot; 82 pcre_uchar *nametable; 83 84 #ifdef COMPILE_PCRE8 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; 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 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 114 115 bot = 0; 116 while (top > bot) 117 { 118 int mid = (top + bot) / 2; 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); 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 148 #if defined COMPILE_PCRE8 149 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 150 pcre_get_stringtable_entries(const pcre *code, const char *stringname, 151 char **firstptr, char **lastptr) 152 #elif defined COMPILE_PCRE16 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) 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) 160 #endif 161 { 162 int rc; 163 int entrysize; 164 int top, bot; 165 pcre_uchar *nametable, *lastentry; 166 167 #ifdef COMPILE_PCRE8 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; 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 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 197 198 lastentry = nametable + entrysize * (top - 1); 199 bot = 0; 200 while (top > bot) 201 { 202 int mid = (top + bot) / 2; 203 pcre_uchar *entry = nametable + entrysize*mid; 204 int c = STRCMP_UC_UC((pcre_uchar *)stringname, 205 (pcre_uchar *)(entry + IMM2_SIZE)); 206 if (c == 0) 207 { 208 pcre_uchar *first = entry; 209 pcre_uchar *last = entry; 210 while (first > nametable) 211 { 212 if (STRCMP_UC_UC((pcre_uchar *)stringname, 213 (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break; 214 first -= entrysize; 215 } 216 while (last < lastentry) 217 { 218 if (STRCMP_UC_UC((pcre_uchar *)stringname, 219 (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break; 220 last += entrysize; 221 } 222 #if defined COMPILE_PCRE8 223 *firstptr = (char *)first; 224 *lastptr = (char *)last; 225 #elif defined COMPILE_PCRE16 226 *firstptr = (PCRE_UCHAR16 *)first; 227 *lastptr = (PCRE_UCHAR16 *)last; 228 #elif defined COMPILE_PCRE32 229 *firstptr = (PCRE_UCHAR32 *)first; 230 *lastptr = (PCRE_UCHAR32 *)last; 231 #endif 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 259 #if defined COMPILE_PCRE8 260 static int 261 get_first_set(const pcre *code, const char *stringname, int *ovector) 262 #elif defined COMPILE_PCRE16 263 static int 264 get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector) 265 #elif defined COMPILE_PCRE32 266 static int 267 get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector) 268 #endif 269 { 270 const REAL_PCRE *re = (const REAL_PCRE *)code; 271 int entrysize; 272 pcre_uchar *entry; 273 #if defined COMPILE_PCRE8 274 char *first, *last; 275 #elif defined COMPILE_PCRE16 276 PCRE_UCHAR16 *first, *last; 277 #elif defined COMPILE_PCRE32 278 PCRE_UCHAR32 *first, *last; 279 #endif 280 281 #if defined COMPILE_PCRE8 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); 285 #elif defined COMPILE_PCRE16 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); 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); 293 #endif 294 if (entrysize <= 0) return entrysize; 295 for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize) 296 { 297 int n = GET2(entry, 0); 298 if (ovector[n*2] >= 0) return n; 299 } 300 return GET2(entry, 0); 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 333 #if defined COMPILE_PCRE8 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) 337 #elif defined COMPILE_PCRE16 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) 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) 345 #endif 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; 353 memcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield)); 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 388 #if defined COMPILE_PCRE8 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) 393 #elif defined COMPILE_PCRE16 394 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 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) 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) 403 #endif 404 { 405 int n = get_first_set(code, stringname, ovector); 406 if (n <= 0) return n; 407 #if defined COMPILE_PCRE8 408 return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); 409 #elif defined COMPILE_PCRE16 410 return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size); 411 #elif defined COMPILE_PCRE32 412 return pcre32_copy_substring(subject, ovector, stringcount, n, buffer, size); 413 #endif 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 439 #if defined COMPILE_PCRE8 440 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 441 pcre_get_substring_list(const char *subject, int *ovector, int stringcount, 442 const char ***listptr) 443 #elif defined COMPILE_PCRE16 444 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 445 pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount, 446 PCRE_SPTR16 **listptr) 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) 451 #endif 452 { 453 int i; 454 int size = sizeof(pcre_uchar *); 455 int double_count = stringcount * 2; 456 pcre_uchar **stringlist; 457 pcre_uchar *p; 458 459 for (i = 0; i < double_count; i += 2) 460 size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1); 461 462 stringlist = (pcre_uchar **)(PUBL(malloc))(size); 463 if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; 464 465 #if defined COMPILE_PCRE8 466 *listptr = (const char **)stringlist; 467 #elif defined COMPILE_PCRE16 468 *listptr = (PCRE_SPTR16 *)stringlist; 469 #elif defined COMPILE_PCRE32 470 *listptr = (PCRE_SPTR32 *)stringlist; 471 #endif 472 p = (pcre_uchar *)(stringlist + stringcount + 1); 473 474 for (i = 0; i < double_count; i += 2) 475 { 476 int len = ovector[i+1] - ovector[i]; 477 memcpy(p, subject + ovector[i], IN_UCHARS(len)); 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 494 programs that can call its functions, but not free() or (PUBL(free))() 495 directly. 496 497 Argument: the result of a previous pcre_get_substring_list() 498 Returns: nothing 499 */ 500 501 #if defined COMPILE_PCRE8 502 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION 503 pcre_free_substring_list(const char **pointer) 504 #elif defined COMPILE_PCRE16 505 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION 506 pcre16_free_substring_list(PCRE_SPTR16 *pointer) 507 #elif defined COMPILE_PCRE32 508 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION 509 pcre32_free_substring_list(PCRE_SPTR32 *pointer) 510 #endif 511 { 512 (PUBL(free))((void *)pointer); 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 542 #if defined COMPILE_PCRE8 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) 546 #elif defined COMPILE_PCRE16 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) 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) 554 #endif 555 { 556 int yield; 557 pcre_uchar *substring; 558 if (stringnumber < 0 || stringnumber >= stringcount) 559 return PCRE_ERROR_NOSUBSTRING; 560 stringnumber *= 2; 561 yield = ovector[stringnumber+1] - ovector[stringnumber]; 562 substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1)); 563 if (substring == NULL) return PCRE_ERROR_NOMEMORY; 564 memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield)); 565 substring[yield] = 0; 566 #if defined COMPILE_PCRE8 567 *stringptr = (const char *)substring; 568 #elif defined COMPILE_PCRE16 569 *stringptr = (PCRE_SPTR16)substring; 570 #elif defined COMPILE_PCRE32 571 *stringptr = (PCRE_SPTR32)substring; 572 #endif 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 605 #if defined COMPILE_PCRE8 606 PCRE_EXP_DEFN int PCRE_CALL_CONVENTION 607 pcre_get_named_substring(const pcre *code, const char *subject, 608 int *ovector, int stringcount, const char *stringname, 609 const char **stringptr) 610 #elif defined COMPILE_PCRE16 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) 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) 620 #endif 621 { 622 int n = get_first_set(code, stringname, ovector); 623 if (n <= 0) return n; 624 #if defined COMPILE_PCRE8 625 return pcre_get_substring(subject, ovector, stringcount, n, stringptr); 626 #elif defined COMPILE_PCRE16 627 return pcre16_get_substring(subject, ovector, stringcount, n, stringptr); 628 #elif defined COMPILE_PCRE32 629 return pcre32_get_substring(subject, ovector, stringcount, n, stringptr); 630 #endif 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 641 programs that can call its functions, but not free() or (PUBL(free))() 642 directly. 643 644 Argument: the result of a previous pcre_get_substring() 645 Returns: nothing 646 */ 647 648 #if defined COMPILE_PCRE8 649 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION 650 pcre_free_substring(const char *pointer) 651 #elif defined COMPILE_PCRE16 652 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION 653 pcre16_free_substring(PCRE_SPTR16 pointer) 654 #elif defined COMPILE_PCRE32 655 PCRE_EXP_DEFN void PCRE_CALL_CONVENTION 656 pcre32_free_substring(PCRE_SPTR32 pointer) 657 #endif 658 { 659 (PUBL(free))((void *)pointer); 660 } 661 662 /* End of pcre_get.c */ 663