File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / pcre / pcre_get.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 08:25:55 2013 UTC (10 years, 10 months ago) by misho
Branches: pcre, MAIN
CVS tags: v8_34, v8_33, HEAD
8.33

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

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