forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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 */
 |