Annotation of embedaddon/pcre/pcre_get.c, revision 1.1.1.2

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>