root/ext/pcre/pcrelib/pcre_get.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pcre_get_stringnumber
  2. pcre_get_stringtable_entries
  3. get_first_set
  4. pcre_copy_substring
  5. pcre_copy_named_substring
  6. pcre_get_substring_list
  7. pcre_free_substring_list
  8. pcre_get_substring
  9. pcre_get_named_substring
  10. pcre_free_substring

   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 */

/* [<][>][^][v][top][bottom][index][help] */