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