253 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			253 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*      Perl-Compatible Regular Expressions       *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* PCRE is a library of functions to support regular expressions whose syntax
							 | 
						||
| 
								 | 
							
								and semantics are as close as possible to those of the Perl 5 language.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                       Written by Philip Hazel
							 | 
						||
| 
								 | 
							
								     Original API code Copyright (c) 1997-2012 University of Cambridge
							 | 
						||
| 
								 | 
							
								          New API code Copyright (c) 2016-2020 University of Cambridge
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								Redistribution and use in source and binary forms, with or without
							 | 
						||
| 
								 | 
							
								modification, are permitted provided that the following conditions are met:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    * Redistributions of source code must retain the above copyright notice,
							 | 
						||
| 
								 | 
							
								      this list of conditions and the following disclaimer.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    * Redistributions in binary form must reproduce the above copyright
							 | 
						||
| 
								 | 
							
								      notice, this list of conditions and the following disclaimer in the
							 | 
						||
| 
								 | 
							
								      documentation and/or other materials provided with the distribution.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    * Neither the name of the University of Cambridge nor the names of its
							 | 
						||
| 
								 | 
							
								      contributors may be used to endorse or promote products derived from
							 | 
						||
| 
								 | 
							
								      this software without specific prior written permission.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
							 | 
						||
| 
								 | 
							
								AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
							 | 
						||
| 
								 | 
							
								IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
							 | 
						||
| 
								 | 
							
								ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
							 | 
						||
| 
								 | 
							
								LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
							 | 
						||
| 
								 | 
							
								CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
							 | 
						||
| 
								 | 
							
								SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
							 | 
						||
| 
								 | 
							
								INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
							 | 
						||
| 
								 | 
							
								CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
							 | 
						||
| 
								 | 
							
								ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
							 | 
						||
| 
								 | 
							
								POSSIBILITY OF SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef HAVE_CONFIG_H
							 | 
						||
| 
								 | 
							
								#include "config.h"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Save the configured link size, which is in bytes. In 16-bit and 32-bit modes
							 | 
						||
| 
								 | 
							
								its value gets changed by pcre2_intmodedep.h (included by pcre2_internal.h) to
							 | 
						||
| 
								 | 
							
								be in code units. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static int configured_link_size = LINK_SIZE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "pcre2_internal.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* These macros are the standard way of turning unquoted text into C strings.
							 | 
						||
| 
								 | 
							
								They allow macros like PCRE2_MAJOR to be defined without quotes, which is
							 | 
						||
| 
								 | 
							
								convenient for user programs that want to test their values. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define STRING(a)  # a
							 | 
						||
| 
								 | 
							
								#define XSTRING(s) STRING(s)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								* Return info about what features are configured *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* If where is NULL, the length of memory required is returned.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Arguments:
							 | 
						||
| 
								 | 
							
								  what             what information is required
							 | 
						||
| 
								 | 
							
								  where            where to put the information
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Returns:           0 if a numerical value is returned
							 | 
						||
| 
								 | 
							
								                   >= 0 if a string value
							 | 
						||
| 
								 | 
							
								                   PCRE2_ERROR_BADOPTION if "where" not recognized
							 | 
						||
| 
								 | 
							
								                     or JIT target requested when JIT not enabled
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
							 | 
						||
| 
								 | 
							
								pcre2_config(uint32_t what, void *where)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								if (where == NULL)  /* Requests a length */
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  switch(what)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								    return PCRE2_ERROR_BADOPTION;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_BSR:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_COMPILED_WIDTHS:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_DEPTHLIMIT:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_HEAPLIMIT:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_JIT:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_LINKSIZE:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_MATCHLIMIT:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_NEVER_BACKSLASH_C:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_NEWLINE:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_PARENSLIMIT:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_STACKRECURSE:    /* Obsolete */
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_TABLES_LENGTH:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_UNICODE:
							 | 
						||
| 
								 | 
							
								    return sizeof(uint32_t);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* These are handled below */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_JITTARGET:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_UNICODE_VERSION:
							 | 
						||
| 
								 | 
							
								    case PCRE2_CONFIG_VERSION:
							 | 
						||
| 
								 | 
							
								    break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								switch (what)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  default:
							 | 
						||
| 
								 | 
							
								  return PCRE2_ERROR_BADOPTION;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_BSR:
							 | 
						||
| 
								 | 
							
								#ifdef BSR_ANYCRLF
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = PCRE2_BSR_ANYCRLF;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = PCRE2_BSR_UNICODE;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_COMPILED_WIDTHS:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 0
							 | 
						||
| 
								 | 
							
								#ifdef SUPPORT_PCRE2_8
							 | 
						||
| 
								 | 
							
								  + 1
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#ifdef SUPPORT_PCRE2_16
							 | 
						||
| 
								 | 
							
								  + 2
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#ifdef SUPPORT_PCRE2_32
							 | 
						||
| 
								 | 
							
								  + 4
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								  ;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_DEPTHLIMIT:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = MATCH_LIMIT_DEPTH;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_HEAPLIMIT:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = HEAP_LIMIT;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_JIT:
							 | 
						||
| 
								 | 
							
								#ifdef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 1;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_JITTARGET:
							 | 
						||
| 
								 | 
							
								#ifdef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    const char *v = PRIV(jit_get_target)();
							 | 
						||
| 
								 | 
							
								    return (int)(1 + ((where == NULL)?
							 | 
						||
| 
								 | 
							
								      strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								  return PCRE2_ERROR_BADOPTION;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_LINKSIZE:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = (uint32_t)configured_link_size;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_MATCHLIMIT:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = MATCH_LIMIT;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_NEWLINE:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = NEWLINE_DEFAULT;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_NEVER_BACKSLASH_C:
							 | 
						||
| 
								 | 
							
								#ifdef NEVER_BACKSLASH_C
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 1;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_PARENSLIMIT:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = PARENS_NEST_LIMIT;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* This is now obsolete. The stack is no longer used via recursion for
							 | 
						||
| 
								 | 
							
								  handling backtracking in pcre2_match(). */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_STACKRECURSE:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 0;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_TABLES_LENGTH:
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = TABLES_LENGTH;
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_UNICODE_VERSION:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								#if defined SUPPORT_UNICODE
							 | 
						||
| 
								 | 
							
								    const char *v = PRIV(unicode_version);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    const char *v = "Unicode not supported";
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return (int)(1 + ((where == NULL)?
							 | 
						||
| 
								 | 
							
								      strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_UNICODE:
							 | 
						||
| 
								 | 
							
								#if defined SUPPORT_UNICODE
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 1;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								  *((uint32_t *)where) = 0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								  break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* The hackery in setting "v" below is to cope with the case when
							 | 
						||
| 
								 | 
							
								  PCRE2_PRERELEASE is set to an empty string (which it is for real releases).
							 | 
						||
| 
								 | 
							
								  If the second alternative is used in this case, it does not leave a space
							 | 
						||
| 
								 | 
							
								  before the date. On the other hand, if all four macros are put into a single
							 | 
						||
| 
								 | 
							
								  XSTRING when PCRE2_PRERELEASE is not empty, an unwanted space is inserted.
							 | 
						||
| 
								 | 
							
								  There are problems using an "obvious" approach like this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     XSTRING(PCRE2_MAJOR) "." XSTRING(PCRE_MINOR)
							 | 
						||
| 
								 | 
							
								     XSTRING(PCRE2_PRERELEASE) " " XSTRING(PCRE_DATE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  because, when PCRE2_PRERELEASE is empty, this leads to an attempted expansion
							 | 
						||
| 
								 | 
							
								  of STRING(). The C standard states: "If (before argument substitution) any
							 | 
						||
| 
								 | 
							
								  argument consists of no preprocessing tokens, the behavior is undefined." It
							 | 
						||
| 
								 | 
							
								  turns out the gcc treats this case as a single empty string - which is what
							 | 
						||
| 
								 | 
							
								  we really want - but Visual C grumbles about the lack of an argument for the
							 | 
						||
| 
								 | 
							
								  macro. Unfortunately, both are within their rights. As there seems to be no
							 | 
						||
| 
								 | 
							
								  way to test for a macro's value being empty at compile time, we have to
							 | 
						||
| 
								 | 
							
								  resort to a runtime test. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case PCRE2_CONFIG_VERSION:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    const char *v = (XSTRING(Z PCRE2_PRERELEASE)[1] == 0)?
							 | 
						||
| 
								 | 
							
								      XSTRING(PCRE2_MAJOR.PCRE2_MINOR PCRE2_DATE) :
							 | 
						||
| 
								 | 
							
								      XSTRING(PCRE2_MAJOR.PCRE2_MINOR) XSTRING(PCRE2_PRERELEASE PCRE2_DATE);
							 | 
						||
| 
								 | 
							
								    return (int)(1 + ((where == NULL)?
							 | 
						||
| 
								 | 
							
								      strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* End of pcre2_config.c */
							 |