165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*      Perl-Compatible Regular Expressions       *
365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE is a library of functions to support regular expressions whose syntax
665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichand semantics are as close as possible to those of the Perl 5 language.
765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                       Written by Philip Hazel
965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich           Copyright (c) 1997-2012 University of Cambridge
1065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich-----------------------------------------------------------------------------
1265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichRedistribution and use in source and binary forms, with or without
1365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmodification, are permitted provided that the following conditions are met:
1465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Redistributions of source code must retain the above copyright notice,
1665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      this list of conditions and the following disclaimer.
1765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Redistributions in binary form must reproduce the above copyright
1965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      notice, this list of conditions and the following disclaimer in the
2065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      documentation and/or other materials provided with the distribution.
2165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
2265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Neither the name of the University of Cambridge nor the names of its
2365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      contributors may be used to endorse or promote products derived from
2465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      this software without specific prior written permission.
2565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
2665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
3065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
3165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
3265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPOSSIBILITY OF SUCH DAMAGE.
3765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich-----------------------------------------------------------------------------
3865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
3965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This module contains some convenience functions for extracting substrings
4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfrom the subject string after a regex match has succeeded. The original idea
4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor these functions came from Scott Wimer. */
4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef HAVE_CONFIG_H
4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "config.h"
4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "pcre_internal.h"
5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*           Find number for named string         *
5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function is used by the get_first_set() function below, as well
5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichas being generally available. It assumes that names are unique.
5965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  code        the compiled regex
6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringname  the name whose number is required
6365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:      the number of the named parentheses, or a negative number
6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                (PCRE_ERROR_NOSUBSTRING) if not found
6665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
6765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
6965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
7065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_get_stringnumber(const pcre *code, const char *stringname)
7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
7265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname)
7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
7565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
7665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_get_stringnumber(const pcre32 *code, PCRE_SPTR32 stringname)
7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
7865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint rc;
8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint entrysize;
8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint top, bot;
8265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar *nametable;
8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE8
8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (top <= 0) return PCRE_ERROR_NOSUBSTRING;
8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
9365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
9465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE16
9565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
9665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
9765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (top <= 0) return PCRE_ERROR_NOSUBSTRING;
9865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
10065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
10165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
10265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
10365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
10465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE32
10565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
10665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
10765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (top <= 0) return PCRE_ERROR_NOSUBSTRING;
10865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
11065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
11165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
11265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
11365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
11465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbot = 0;
11665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhile (top > bot)
11765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
11865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int mid = (top + bot) / 2;
11965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar *entry = nametable + entrysize*mid;
12065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int c = STRCMP_UC_UC((pcre_uchar *)stringname,
12165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    (pcre_uchar *)(entry + IMM2_SIZE));
12265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (c == 0) return GET2(entry, 0);
12365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (c > 0) bot = mid + 1; else top = mid;
12465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
12565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
12665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn PCRE_ERROR_NOSUBSTRING;
12765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
12865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
12965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
13265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*     Find (multiple) entries for named string   *
13365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
13465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This is used by the get_first_set() function below, as well as being
13665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichgenerally available. It is used when duplicated names are permitted.
13765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
13965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  code        the compiled regex
14065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringname  the name whose entries required
14165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  firstptr    where to put the pointer to the first entry
14265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  lastptr     where to put the pointer to the last entry
14365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
14465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:      the length of each entry, or a negative number
14565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                (PCRE_ERROR_NOSUBSTRING) if not found
14665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
14765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
14865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
14965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
15065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_get_stringtable_entries(const pcre *code, const char *stringname,
15165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  char **firstptr, char **lastptr)
15265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
15365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
15465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname,
15565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr)
15665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
15765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
15865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_get_stringtable_entries(const pcre32 *code, PCRE_SPTR32 stringname,
15965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_UCHAR32 **firstptr, PCRE_UCHAR32 **lastptr)
16065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
16165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
16265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint rc;
16365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint entrysize;
16465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint top, bot;
16565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar *nametable, *lastentry;
16665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
16765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE8
16865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
16965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
17065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (top <= 0) return PCRE_ERROR_NOSUBSTRING;
17165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
17265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
17365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
17465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
17565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
17665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
17765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE16
17865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
17965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
18065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (top <= 0) return PCRE_ERROR_NOSUBSTRING;
18165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
18265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
18365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
18465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
18565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
18665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
18765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE32
18865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
18965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
19065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (top <= 0) return PCRE_ERROR_NOSUBSTRING;
19165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
19265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
19365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
19465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
19565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return rc;
19665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
19765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
19865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlastentry = nametable + entrysize * (top - 1);
19965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbot = 0;
20065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhile (top > bot)
20165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
20265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int mid = (top + bot) / 2;
20365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar *entry = nametable + entrysize*mid;
20465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int c = STRCMP_UC_UC((pcre_uchar *)stringname,
20565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    (pcre_uchar *)(entry + IMM2_SIZE));
20665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (c == 0)
20765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {
20865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    pcre_uchar *first = entry;
20965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    pcre_uchar *last = entry;
21065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    while (first > nametable)
21165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
21265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if (STRCMP_UC_UC((pcre_uchar *)stringname,
21365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break;
21465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      first -= entrysize;
21565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
21665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    while (last < lastentry)
21765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
21865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if (STRCMP_UC_UC((pcre_uchar *)stringname,
21965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break;
22065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      last += entrysize;
22165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
22265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
22365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *firstptr = (char *)first;
22465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *lastptr = (char *)last;
22565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
22665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *firstptr = (PCRE_UCHAR16 *)first;
22765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *lastptr = (PCRE_UCHAR16 *)last;
22865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
22965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *firstptr = (PCRE_UCHAR32 *)first;
23065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    *lastptr = (PCRE_UCHAR32 *)last;
23165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
23265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    return entrysize;
23365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    }
23465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (c > 0) bot = mid + 1; else top = mid;
23565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
23665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
23765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn PCRE_ERROR_NOSUBSTRING;
23865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
23965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
24365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*    Find first set of multiple named strings    *
24465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
24565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function allows for duplicate names in the table of named substrings.
24765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIt returns the number of the first one that was set in a pattern match.
24865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
25065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  code         the compiled regex
25165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringname   the name of the capturing substring
25265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ovector      the vector of matched substrings
25365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:       the number of the first that is set,
25565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich               or the number of the last one if none are set,
25665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich               or a negative number on error
25765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
25865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
26065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic int
26165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichget_first_set(const pcre *code, const char *stringname, int *ovector)
26265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
26365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic int
26465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichget_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector)
26565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
26665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic int
26765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichget_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector)
26865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
26965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
27065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichconst REAL_PCRE *re = (const REAL_PCRE *)code;
27165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint entrysize;
27265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar *entry;
27365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
27465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchar *first, *last;
27565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
27665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_UCHAR16 *first, *last;
27765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
27865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_UCHAR32 *first, *last;
27965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
28065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
28165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
28265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
28365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return pcre_get_stringnumber(code, stringname);
28465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichentrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);
28565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
28665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
28765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return pcre16_get_stringnumber(code, stringname);
28865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichentrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last);
28965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
29065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
29165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return pcre32_get_stringnumber(code, stringname);
29265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichentrysize = pcre32_get_stringtable_entries(code, stringname, &first, &last);
29365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
29465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (entrysize <= 0) return entrysize;
29565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)
29665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
29765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int n = GET2(entry, 0);
29865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (ovector[n*2] >= 0) return n;
29965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
30065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn GET2(entry, 0);
30165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
30265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
30765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*      Copy captured string to given buffer      *
30865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
30965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function copies a single captured substring into a given buffer.
31165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichNote that we use memcpy() rather than strncpy() in case there are binary zeros
31265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichin the string.
31365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
31565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  subject        the subject string that was matched
31665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ovector        pointer to the offsets table
31765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringcount    the number of substrings that were captured
31865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   (i.e. the yield of the pcre_exec call, unless
31965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that was zero, in which case it should be 1/3
32065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   of the offset table size)
32165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringnumber   the number of the required substring
32265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  buffer         where to put the substring
32365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  size           the size of the buffer
32465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
32565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:         if successful:
32665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   the length of the copied string, not including the zero
32765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that is put on the end; can be zero
32865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                 if not successful:
32965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOMEMORY (-6) buffer too small
33065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
33165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
33265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
33465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
33565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_copy_substring(const char *subject, int *ovector, int stringcount,
33665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int stringnumber, char *buffer, int size)
33765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
33865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
33965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
34065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int stringnumber, PCRE_UCHAR16 *buffer, int size)
34165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
34265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
34365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
34465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int stringnumber, PCRE_UCHAR32 *buffer, int size)
34565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
34665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
34765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint yield;
34865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (stringnumber < 0 || stringnumber >= stringcount)
34965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return PCRE_ERROR_NOSUBSTRING;
35065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstringnumber *= 2;
35165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichyield = ovector[stringnumber+1] - ovector[stringnumber];
35265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (size < yield + 1) return PCRE_ERROR_NOMEMORY;
35365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmemcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield));
35465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbuffer[yield] = 0;
35565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn yield;
35665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
35765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
35865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
35965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
36065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
36165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*   Copy named captured string to given buffer   *
36265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
36365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
36465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function copies a single captured substring into a given buffer,
36565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichidentifying it by name. If the regex permits duplicate names, the first
36665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsubstring that is set is chosen.
36765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
36865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
36965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  code           the compiled regex
37065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  subject        the subject string that was matched
37165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ovector        pointer to the offsets table
37265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringcount    the number of substrings that were captured
37365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   (i.e. the yield of the pcre_exec call, unless
37465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that was zero, in which case it should be 1/3
37565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   of the offset table size)
37665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringname     the name of the required substring
37765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  buffer         where to put the substring
37865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  size           the size of the buffer
37965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
38065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:         if successful:
38165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   the length of the copied string, not including the zero
38265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that is put on the end; can be zero
38365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                 if not successful:
38465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOMEMORY (-6) buffer too small
38565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
38665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
38765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
38865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
38965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
39065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_copy_named_substring(const pcre *code, const char *subject,
39165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int *ovector, int stringcount, const char *stringname,
39265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  char *buffer, int size)
39365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
39465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
39565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
39665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int *ovector, int stringcount, PCRE_SPTR16 stringname,
39765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_UCHAR16 *buffer, int size)
39865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
39965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
40065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
40165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int *ovector, int stringcount, PCRE_SPTR32 stringname,
40265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_UCHAR32 *buffer, int size)
40365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
40465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
40565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint n = get_first_set(code, stringname, ovector);
40665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (n <= 0) return n;
40765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
40865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
40965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
41065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size);
41165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
41265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn pcre32_copy_substring(subject, ovector, stringcount, n, buffer, size);
41365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
41465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
41565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
41665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
41765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
41865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
41965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*      Copy all captured strings to new store    *
42065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
42165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function gets one chunk of store and builds a list of pointers and all
42365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichof the captured substrings in it. A NULL pointer is put on the end of the list.
42465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
42665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  subject        the subject string that was matched
42765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ovector        pointer to the offsets table
42865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringcount    the number of substrings that were captured
42965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   (i.e. the yield of the pcre_exec call, unless
43065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that was zero, in which case it should be 1/3
43165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   of the offset table size)
43265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  listptr        set to point to the list of pointers
43365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:         if successful: 0
43565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                 if not successful:
43665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOMEMORY (-6) failed to get store
43765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
43865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
44065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
44165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_get_substring_list(const char *subject, int *ovector, int stringcount,
44265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const char ***listptr)
44365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
44465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
44565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount,
44665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_SPTR16 **listptr)
44765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
44865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
44965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_get_substring_list(PCRE_SPTR32 subject, int *ovector, int stringcount,
45065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_SPTR32 **listptr)
45165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
45265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
45365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint i;
45465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint size = sizeof(pcre_uchar *);
45565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint double_count = stringcount * 2;
45665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar **stringlist;
45765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar *p;
45865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor (i = 0; i < double_count; i += 2)
46065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1);
46165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstringlist = (pcre_uchar **)(PUBL(malloc))(size);
46365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
46465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
46665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*listptr = (const char **)stringlist;
46765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
46865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*listptr = (PCRE_SPTR16 *)stringlist;
46965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
47065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*listptr = (PCRE_SPTR32 *)stringlist;
47165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
47265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichp = (pcre_uchar *)(stringlist + stringcount + 1);
47365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
47465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor (i = 0; i < double_count; i += 2)
47565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
47665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int len = ovector[i+1] - ovector[i];
47765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  memcpy(p, subject + ovector[i], IN_UCHARS(len));
47865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  *stringlist++ = p;
47965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  p += len;
48065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  *p++ = 0;
48165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
48265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*stringlist = NULL;
48465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn 0;
48565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
48665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
49065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*   Free store obtained by get_substring_list    *
49165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
49265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
49365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function exists for the benefit of people calling PCRE from non-C
49465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichprograms that can call its functions, but not free() or (PUBL(free))()
49565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdirectly.
49665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
49765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArgument:   the result of a previous pcre_get_substring_list()
49865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:    nothing
49965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
50065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
50165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
50265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN void PCRE_CALL_CONVENTION
50365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_free_substring_list(const char **pointer)
50465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
50565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN void PCRE_CALL_CONVENTION
50665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_free_substring_list(PCRE_SPTR16 *pointer)
50765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
50865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN void PCRE_CALL_CONVENTION
50965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_free_substring_list(PCRE_SPTR32 *pointer)
51065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
51165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
51265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(PUBL(free))((void *)pointer);
51365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
51465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
51865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*      Copy captured string to new store         *
51965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
52065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
52165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function copies a single captured substring into a piece of new
52265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstore
52365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
52465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
52565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  subject        the subject string that was matched
52665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ovector        pointer to the offsets table
52765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringcount    the number of substrings that were captured
52865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   (i.e. the yield of the pcre_exec call, unless
52965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that was zero, in which case it should be 1/3
53065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   of the offset table size)
53165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringnumber   the number of the required substring
53265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringptr      where to put a pointer to the substring
53365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:         if successful:
53565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   the length of the string, not including the zero that
53665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   is put on the end; can be zero
53765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                 if not successful:
53865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOMEMORY (-6) failed to get store
53965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOSUBSTRING (-7) substring not present
54065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
54165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
54265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
54365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
54465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_get_substring(const char *subject, int *ovector, int stringcount,
54565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int stringnumber, const char **stringptr)
54665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
54765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
54865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
54965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int stringnumber, PCRE_SPTR16 *stringptr)
55065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
55165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
55265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_get_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
55365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int stringnumber, PCRE_SPTR32 *stringptr)
55465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
55565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
55665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint yield;
55765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar *substring;
55865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (stringnumber < 0 || stringnumber >= stringcount)
55965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return PCRE_ERROR_NOSUBSTRING;
56065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstringnumber *= 2;
56165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichyield = ovector[stringnumber+1] - ovector[stringnumber];
56265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsubstring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1));
56365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (substring == NULL) return PCRE_ERROR_NOMEMORY;
56465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmemcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield));
56565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsubstring[yield] = 0;
56665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
56765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*stringptr = (const char *)substring;
56865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
56965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*stringptr = (PCRE_SPTR16)substring;
57065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
57165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*stringptr = (PCRE_SPTR32)substring;
57265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
57365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn yield;
57465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
57565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
57965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*   Copy named captured string to new store      *
58065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
58165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
58265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function copies a single captured substring, identified by name, into
58365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnew store. If the regex permits duplicate names, the first substring that is
58465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichset is chosen.
58565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
58665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments:
58765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  code           the compiled regex
58865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  subject        the subject string that was matched
58965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ovector        pointer to the offsets table
59065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringcount    the number of substrings that were captured
59165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   (i.e. the yield of the pcre_exec call, unless
59265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that was zero, in which case it should be 1/3
59365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   of the offset table size)
59465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringname     the name of the required substring
59565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  stringptr      where to put the pointer
59665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
59765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:         if successful:
59865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   the length of the copied string, not including the zero
59965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   that is put on the end; can be zero
60065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                 if not successful:
60165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOMEMORY (-6) couldn't get memory
60265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
60365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
60465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
60565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
60665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
60765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_get_named_substring(const pcre *code, const char *subject,
60865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int *ovector, int stringcount, const char *stringname,
60965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const char **stringptr)
61065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
61165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
61265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
61365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int *ovector, int stringcount, PCRE_SPTR16 stringname,
61465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_SPTR16 *stringptr)
61565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
61665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION
61765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
61865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int *ovector, int stringcount, PCRE_SPTR32 stringname,
61965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_SPTR32 *stringptr)
62065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
62165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
62265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint n = get_first_set(code, stringname, ovector);
62365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (n <= 0) return n;
62465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
62565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn pcre_get_substring(subject, ovector, stringcount, n, stringptr);
62665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
62765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn pcre16_get_substring(subject, ovector, stringcount, n, stringptr);
62865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
62965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn pcre32_get_substring(subject, ovector, stringcount, n, stringptr);
63065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
63165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
63265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
63365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
63465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
63565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
63665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
63765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*       Free store obtained by get_substring     *
63865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
63965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
64065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function exists for the benefit of people calling PCRE from non-C
64165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichprograms that can call its functions, but not free() or (PUBL(free))()
64265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdirectly.
64365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
64465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArgument:   the result of a previous pcre_get_substring()
64565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns:    nothing
64665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
64765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
64865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
64965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN void PCRE_CALL_CONVENTION
65065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_free_substring(const char *pointer)
65165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
65265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN void PCRE_CALL_CONVENTION
65365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_free_substring(PCRE_SPTR16 pointer)
65465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
65565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN void PCRE_CALL_CONVENTION
65665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_free_substring(PCRE_SPTR32 pointer)
65765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
65865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
65965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(PUBL(free))((void *)pointer);
66065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
66165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
66265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* End of pcre_get.c */
663