forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			233 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			233 lines
		
	
	
		
			7.0 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 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.
							 | 
						||
| 
								 | 
							
								-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef INCLUDED_FROM_PCRE2_JIT_COMPILE
							 | 
						||
| 
								 | 
							
								#error This file must be included from pcre2_jit_compile.c.
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*           Free JIT read-only data              *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void
							 | 
						||
| 
								 | 
							
								PRIV(jit_free_rodata)(void *current, void *allocator_data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								(void)current;
							 | 
						||
| 
								 | 
							
								(void)allocator_data;
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								void *next;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SLJIT_UNUSED_ARG(allocator_data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								while (current != NULL)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  next = *(void**)current;
							 | 
						||
| 
								 | 
							
								  SLJIT_FREE(current, allocator_data);
							 | 
						||
| 
								 | 
							
								  current = next;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*           Free JIT compiled code               *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void
							 | 
						||
| 
								 | 
							
								PRIV(jit_free)(void *executable_jit, pcre2_memctl *memctl)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								(void)executable_jit;
							 | 
						||
| 
								 | 
							
								(void)memctl;
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								executable_functions *functions = (executable_functions *)executable_jit;
							 | 
						||
| 
								 | 
							
								void *allocator_data = memctl;
							 | 
						||
| 
								 | 
							
								int i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  if (functions->executable_funcs[i] != NULL)
							 | 
						||
| 
								 | 
							
								    sljit_free_code(functions->executable_funcs[i], NULL);
							 | 
						||
| 
								 | 
							
								  PRIV(jit_free_rodata)(functions->read_only_data_heads[i], allocator_data);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SLJIT_FREE(functions, allocator_data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*            Free unused JIT memory              *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
							 | 
						||
| 
								 | 
							
								pcre2_jit_free_unused_memory(pcre2_general_context *gcontext)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								(void)gcontext;     /* Suppress warning */
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								SLJIT_UNUSED_ARG(gcontext);
							 | 
						||
| 
								 | 
							
								sljit_free_unused_memory_exec();
							 | 
						||
| 
								 | 
							
								#endif  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*            Allocate a JIT stack                *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PCRE2_EXP_DEFN pcre2_jit_stack * PCRE2_CALL_CONVENTION
							 | 
						||
| 
								 | 
							
								pcre2_jit_stack_create(size_t startsize, size_t maxsize,
							 | 
						||
| 
								 | 
							
								  pcre2_general_context *gcontext)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(void)gcontext;
							 | 
						||
| 
								 | 
							
								(void)startsize;
							 | 
						||
| 
								 | 
							
								(void)maxsize;
							 | 
						||
| 
								 | 
							
								return NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pcre2_jit_stack *jit_stack;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (startsize == 0 || maxsize == 0 || maxsize > SIZE_MAX - STACK_GROWTH_RATE)
							 | 
						||
| 
								 | 
							
								  return NULL;
							 | 
						||
| 
								 | 
							
								if (startsize > maxsize)
							 | 
						||
| 
								 | 
							
								  startsize = maxsize;
							 | 
						||
| 
								 | 
							
								startsize = (startsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);
							 | 
						||
| 
								 | 
							
								maxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								jit_stack = PRIV(memctl_malloc)(sizeof(pcre2_real_jit_stack), (pcre2_memctl *)gcontext);
							 | 
						||
| 
								 | 
							
								if (jit_stack == NULL) return NULL;
							 | 
						||
| 
								 | 
							
								jit_stack->stack = sljit_allocate_stack(startsize, maxsize, &jit_stack->memctl);
							 | 
						||
| 
								 | 
							
								if (jit_stack->stack == NULL)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  jit_stack->memctl.free(jit_stack, jit_stack->memctl.memory_data);
							 | 
						||
| 
								 | 
							
								  return NULL;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								return jit_stack;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*         Assign a JIT stack to a pattern        *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
							 | 
						||
| 
								 | 
							
								pcre2_jit_stack_assign(pcre2_match_context *mcontext, pcre2_jit_callback callback,
							 | 
						||
| 
								 | 
							
								  void *callback_data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								(void)mcontext;
							 | 
						||
| 
								 | 
							
								(void)callback;
							 | 
						||
| 
								 | 
							
								(void)callback_data;
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (mcontext == NULL) return;
							 | 
						||
| 
								 | 
							
								mcontext->jit_callback = callback;
							 | 
						||
| 
								 | 
							
								mcontext->jit_callback_data = callback_data;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*               Free a JIT stack                 *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
							 | 
						||
| 
								 | 
							
								pcre2_jit_stack_free(pcre2_jit_stack *jit_stack)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								(void)jit_stack;
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								if (jit_stack != NULL)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  sljit_free_stack((struct sljit_stack *)(jit_stack->stack), &jit_stack->memctl);
							 | 
						||
| 
								 | 
							
								  jit_stack->memctl.free(jit_stack, jit_stack->memctl.memory_data);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								#endif  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*               Get target CPU type              *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const char*
							 | 
						||
| 
								 | 
							
								PRIV(jit_get_target)(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								return "JIT is not supported";
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								return sljit_get_platform_name();
							 | 
						||
| 
								 | 
							
								#endif  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*************************************************
							 | 
						||
| 
								 | 
							
								*              Get size of JIT code              *
							 | 
						||
| 
								 | 
							
								*************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								size_t
							 | 
						||
| 
								 | 
							
								PRIV(jit_get_size)(void *executable_jit)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifndef SUPPORT_JIT
							 | 
						||
| 
								 | 
							
								(void)executable_jit;
							 | 
						||
| 
								 | 
							
								return 0;
							 | 
						||
| 
								 | 
							
								#else  /* SUPPORT_JIT */
							 | 
						||
| 
								 | 
							
								sljit_uw *executable_sizes = ((executable_functions *)executable_jit)->executable_sizes;
							 | 
						||
| 
								 | 
							
								SLJIT_COMPILE_ASSERT(JIT_NUMBER_OF_COMPILE_MODES == 3, number_of_compile_modes_changed);
							 | 
						||
| 
								 | 
							
								return executable_sizes[0] + executable_sizes[1] + executable_sizes[2];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* End of pcre2_jit_misc.c */
							 |