LCOV - code coverage report
Current view: top level - fuzz/pcre - get.c (source / functions) Hit Total Coverage
Test: trace.lcov_info_final Lines: 0 43 0.0 %
Date: 2021-02-22 04:51:02 Functions: 0 5 0.0 %

          Line data    Source code
       1             : /*************************************************
       2             : *      Perl-Compatible Regular Expressions       *
       3             : *************************************************/
       4             : 
       5             : /*
       6             : This is a library of functions to support regular expressions whose syntax
       7             : and semantics are as close as possible to those of the Perl 5 language. See
       8             : the file Tech.Notes for some information on the internals.
       9             : 
      10             : Written by: Philip Hazel <ph10@cam.ac.uk>
      11             : 
      12             :            Copyright (c) 1997-2000 University of Cambridge
      13             : 
      14             : -----------------------------------------------------------------------------
      15             : Permission is granted to anyone to use this software for any purpose on any
      16             : computer system, and to redistribute it freely, subject to the following
      17             : restrictions:
      18             : 
      19             : 1. This software is distributed in the hope that it will be useful,
      20             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      21             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      22             : 
      23             : 2. The origin of this software must not be misrepresented, either by
      24             :    explicit claim or by omission.
      25             : 
      26             : 3. Altered versions must be plainly marked as such, and must not be
      27             :    misrepresented as being the original software.
      28             : 
      29             : 4. If PCRE is embedded in any software that is released under the GNU
      30             :    General Purpose Licence (GPL), then the terms of that licence shall
      31             :    supersede any condition above with which it is incompatible.
      32             : -----------------------------------------------------------------------------
      33             : */
      34             : 
      35             : /* This module contains some convenience functions for extracting substrings
      36             : from the subject string after a regex match has succeeded. The original idea
      37             : for these functions came from Scott Wimer <scottw@cgibuilder.com>. */
      38             : 
      39             : 
      40             : /* Include the internals header, which itself includes Standard C headers plus
      41             : the external pcre header. */
      42             : 
      43             : #include "internal.h"
      44             : 
      45             : 
      46             : 
      47             : /*************************************************
      48             : *      Copy captured string to given buffer      *
      49             : *************************************************/
      50             : 
      51             : /* This function copies a single captured substring into a given buffer.
      52             : Note that we use memcpy() rather than strncpy() in case there are binary zeros
      53             : in the string.
      54             : 
      55             : Arguments:
      56             :   subject        the subject string that was matched
      57             :   ovector        pointer to the offsets table
      58             :   stringcount    the number of substrings that were captured
      59             :                    (i.e. the yield of the pcre_exec call, unless
      60             :                    that was zero, in which case it should be 1/3
      61             :                    of the offset table size)
      62             :   stringnumber   the number of the required substring
      63             :   buffer         where to put the substring
      64             :   size           the size of the buffer
      65             : 
      66             : Returns:         if successful:
      67             :                    the length of the copied string, not including the zero
      68             :                    that is put on the end; can be zero
      69             :                  if not successful:
      70             :                    PCRE_ERROR_NOMEMORY (-6) buffer too small
      71             :                    PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
      72             : */
      73             : 
      74             : int
      75           0 : pcre_copy_substring(const char *subject, int *ovector, int stringcount,
      76             :   int stringnumber, char *buffer, int size)
      77             : {
      78             : int yield;
      79           0 : if (stringnumber < 0 || stringnumber >= stringcount)
      80           0 :   return PCRE_ERROR_NOSUBSTRING;
      81           0 : stringnumber *= 2;
      82           0 : yield = ovector[stringnumber+1] - ovector[stringnumber];
      83           0 : if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
      84           0 : memcpy(buffer, subject + ovector[stringnumber], yield);
      85           0 : buffer[yield] = 0;
      86           0 : return yield;
      87             : }
      88             : 
      89             : 
      90             : 
      91             : /*************************************************
      92             : *      Copy all captured strings to new store    *
      93             : *************************************************/
      94             : 
      95             : /* This function gets one chunk of store and builds a list of pointers and all
      96             : of the captured substrings in it. A NULL pointer is put on the end of the list.
      97             : 
      98             : Arguments:
      99             :   subject        the subject string that was matched
     100             :   ovector        pointer to the offsets table
     101             :   stringcount    the number of substrings that were captured
     102             :                    (i.e. the yield of the pcre_exec call, unless
     103             :                    that was zero, in which case it should be 1/3
     104             :                    of the offset table size)
     105             :   listptr        set to point to the list of pointers
     106             : 
     107             : Returns:         if successful: 0
     108             :                  if not successful:
     109             :                    PCRE_ERROR_NOMEMORY (-6) failed to get store
     110             : */
     111             : 
     112             : int
     113           0 : pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
     114             :   const char ***listptr)
     115             : {
     116             : int i;
     117           0 : int size = sizeof(char *);
     118           0 : int double_count = stringcount * 2;
     119             : char **stringlist;
     120             : char *p;
     121             : 
     122           0 : for (i = 0; i < double_count; i += 2)
     123           0 :   size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
     124             : 
     125           0 : stringlist = (char **)(pcre_malloc)(size);
     126           0 : if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
     127             : 
     128           0 : *listptr = (const char **)stringlist;
     129           0 : p = (char *)(stringlist + stringcount + 1);
     130             : 
     131           0 : for (i = 0; i < double_count; i += 2)
     132             :   {
     133           0 :   int len = ovector[i+1] - ovector[i];
     134           0 :   memcpy(p, subject + ovector[i], len);
     135           0 :   *stringlist++ = p;
     136           0 :   p += len;
     137           0 :   *p++ = 0;
     138             :   }
     139             : 
     140           0 : *stringlist = NULL;
     141           0 : return 0;
     142             : }
     143             : 
     144             : 
     145             : 
     146             : /*************************************************
     147             : *   Free store obtained by get_substring_list    *
     148             : *************************************************/
     149             : 
     150             : /* This function exists for the benefit of people calling PCRE from non-C
     151             : programs that can call its functions, but not free() or (pcre_free)() directly.
     152             : 
     153             : Argument:   the result of a previous pcre_get_substring_list()
     154             : Returns:    nothing
     155             : */
     156             : 
     157             : void
     158           0 : pcre_free_substring_list(const char **pointer)
     159             : {
     160           0 : (pcre_free)((void *)pointer);
     161           0 : }
     162             : 
     163             : 
     164             : 
     165             : /*************************************************
     166             : *      Copy captured string to new store         *
     167             : *************************************************/
     168             : 
     169             : /* This function copies a single captured substring into a piece of new
     170             : store
     171             : 
     172             : Arguments:
     173             :   subject        the subject string that was matched
     174             :   ovector        pointer to the offsets table
     175             :   stringcount    the number of substrings that were captured
     176             :                    (i.e. the yield of the pcre_exec call, unless
     177             :                    that was zero, in which case it should be 1/3
     178             :                    of the offset table size)
     179             :   stringnumber   the number of the required substring
     180             :   stringptr      where to put a pointer to the substring
     181             : 
     182             : Returns:         if successful:
     183             :                    the length of the string, not including the zero that
     184             :                    is put on the end; can be zero
     185             :                  if not successful:
     186             :                    PCRE_ERROR_NOMEMORY (-6) failed to get store
     187             :                    PCRE_ERROR_NOSUBSTRING (-7) substring not present
     188             : */
     189             : 
     190             : int
     191           0 : pcre_get_substring(const char *subject, int *ovector, int stringcount,
     192             :   int stringnumber, const char **stringptr)
     193             : {
     194             : int yield;
     195             : char *substring;
     196           0 : if (stringnumber < 0 || stringnumber >= stringcount)
     197           0 :   return PCRE_ERROR_NOSUBSTRING;
     198           0 : stringnumber *= 2;
     199           0 : yield = ovector[stringnumber+1] - ovector[stringnumber];
     200           0 : substring = (char *)(pcre_malloc)(yield + 1);
     201           0 : if (substring == NULL) return PCRE_ERROR_NOMEMORY;
     202           0 : memcpy(substring, subject + ovector[stringnumber], yield);
     203           0 : substring[yield] = 0;
     204           0 : *stringptr = substring;
     205           0 : return yield;
     206             : }
     207             : 
     208             : 
     209             : 
     210             : /*************************************************
     211             : *       Free store obtained by get_substring     *
     212             : *************************************************/
     213             : 
     214             : /* This function exists for the benefit of people calling PCRE from non-C
     215             : programs that can call its functions, but not free() or (pcre_free)() directly.
     216             : 
     217             : Argument:   the result of a previous pcre_get_substring()
     218             : Returns:    nothing
     219             : */
     220             : 
     221             : void
     222           0 : pcre_free_substring(const char *pointer)
     223             : {
     224           0 : (pcre_free)((void *)pointer);
     225           0 : }
     226             : 
     227             : /* End of get.c */

Generated by: LCOV version 1.14