320 lines
11 KiB
Diff
320 lines
11 KiB
Diff
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/CMakeLists.txt pcre_h3/CMakeLists.txt
|
|
*** pcre/CMakeLists.txt 2022-08-26 14:59:03.216000000 +0800
|
|
--- pcre_h3/CMakeLists.txt 2022-08-26 14:58:53.904000000 +0800
|
|
***************
|
|
*** 136,141 ****
|
|
--- 136,143 ----
|
|
|
|
OPTION(PCRE_BUILD_PCRECPP "Build the PCRE C++ library (pcrecpp)." ON)
|
|
|
|
+ OPTION(SLJIT_SUPPORT_CUSTOM_ALLOC "Enable support for custom sljit alloc." OFF)
|
|
+
|
|
SET(PCRE_EBCDIC OFF CACHE BOOL
|
|
"Use EBCDIC coding instead of ASCII. (This is rarely used outside of mainframe systems.)")
|
|
|
|
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/pcre_chartables.c.dist pcre_h3/pcre_chartables.c.dist
|
|
*** pcre/pcre_chartables.c.dist 2022-08-26 14:59:03.248000000 +0800
|
|
--- pcre_h3/pcre_chartables.c.dist 2022-08-26 14:58:53.932000000 +0800
|
|
***************
|
|
*** 196,198 ****
|
|
--- 196,219 ----
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
|
|
|
|
/* End of pcre_chartables.c */
|
|
+ #ifdef SLJIT_SUPPORT_CUSTOM_ALLOC
|
|
+ int pcre_set_chartables_ext(unsigned char *tbl, int size)
|
|
+ {
|
|
+ if (tbl == NULL || size <= 0) {
|
|
+ return -1;
|
|
+ }
|
|
+ int total_len = sizeof(PRIV(default_tables));
|
|
+ if (total_len != size) {
|
|
+ return -1;
|
|
+ }
|
|
+ unsigned char *src_tables = PRIV(default_tables);
|
|
+ memcpy(tbl, src_tables, size);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ int pcre_get_chartables_size()
|
|
+ {
|
|
+ int size = sizeof(PRIV(default_tables));
|
|
+ return size;
|
|
+ }
|
|
+ #endif
|
|
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/pcre_compile.c pcre_h3/pcre_compile.c
|
|
*** pcre/pcre_compile.c 2022-08-26 14:59:03.248000000 +0800
|
|
--- pcre_h3/pcre_compile.c 2022-08-26 14:58:53.936000000 +0800
|
|
***************
|
|
*** 88,94 ****
|
|
--- 88,112 ----
|
|
pcre_uint32 *, pcre_int32 *, pcre_uint32 *, pcre_int32 *, branch_chain *,
|
|
compile_data *, int *);
|
|
|
|
+ #if defined SUPPORT_EGN_MODE
|
|
+ static egn_read_atomic_callout g_egn_read_atomic_callout = NULL;
|
|
+ __attribute__((visibility("default"))) void egn_init_pcrex_callout(egn_read_atomic_callout read_atomic_callout,
|
|
+ egn_extend_callout callout)
|
|
+ {
|
|
+ egn_init_extend_callout(callout);
|
|
+ g_egn_read_atomic_callout = read_atomic_callout;
|
|
+ return;
|
|
+ }
|
|
|
|
+ #if defined COMPILE_PCRE8
|
|
+ __attribute__((visibility("default"))) PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION egn_pcre_compile2(
|
|
+ const char *pattern, int options, int *errorcodeptr, const char **errorptr, int *erroroffset,
|
|
+ const unsigned char *tables)
|
|
+ {
|
|
+ return pcre_compile2(pattern, options, errorcodeptr, errorptr, erroroffset, tables);
|
|
+ }
|
|
+ #endif
|
|
+ #endif
|
|
|
|
/*************************************************
|
|
* Code parameters and static tables *
|
|
***************
|
|
*** 7150,7157 ****
|
|
}
|
|
previous = NULL;
|
|
continue;
|
|
|
|
!
|
|
/* ------------------------------------------------------------ */
|
|
case CHAR_P: /* Python-style named subpattern handling */
|
|
if (*(++ptr) == CHAR_EQUALS_SIGN ||
|
|
--- 7168,7202 ----
|
|
}
|
|
previous = NULL;
|
|
continue;
|
|
+ #if defined SUPPORT_EGN_MODE
|
|
+ case CHAR_F: {
|
|
+ if (g_egn_read_atomic_callout == NULL) {
|
|
+ goto OTHER_CHAR_AFTER_QUERY;
|
|
+ }
|
|
+ unsigned int is_saved = 0;
|
|
+ int ret = g_egn_read_atomic_callout((const char *)cd->start_pattern, (const char **)&ptr, lengthptr, &is_saved);
|
|
+ if (ret != 0) {
|
|
+ *errorcodeptr = ERR38;
|
|
+ goto FAILED;
|
|
+ }
|
|
|
|
! if (*ptr != CHAR_RIGHT_PARENTHESIS) {
|
|
! *errorcodeptr = ERR39;
|
|
! goto FAILED;
|
|
! }
|
|
! if (is_saved == 1) {
|
|
! previous_callout = code; /* Save for later completion */
|
|
! after_manual_callout = 1; /* Skip one item before completing */
|
|
! *code++ = OP_CALLOUT;
|
|
! *code++ = ret;
|
|
! PUT(code, 0, ptr - cd->start_pattern + 1); /* Pattern offset */
|
|
! PUT(code, LINK_SIZE, 0); /* Default length */
|
|
! code += 2 * LINK_SIZE;
|
|
! }
|
|
! previous = NULL;
|
|
! }
|
|
! continue;
|
|
! #endif
|
|
/* ------------------------------------------------------------ */
|
|
case CHAR_P: /* Python-style named subpattern handling */
|
|
if (*(++ptr) == CHAR_EQUALS_SIGN ||
|
|
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/pcre_exec.c pcre_h3/pcre_exec.c
|
|
*** pcre/pcre_exec.c 2022-08-26 14:59:03.252000000 +0800
|
|
--- pcre_h3/pcre_exec.c 2022-08-26 14:58:53.936000000 +0800
|
|
***************
|
|
*** 138,145 ****
|
|
}
|
|
#endif
|
|
|
|
|
|
!
|
|
/*************************************************
|
|
* Match a back-reference *
|
|
*************************************************/
|
|
--- 138,160 ----
|
|
}
|
|
#endif
|
|
|
|
+ #if defined SUPPORT_EGN_MODE
|
|
+ static egn_extend_callout g_egn_extend_callout = NULL;
|
|
+ void egn_init_extend_callout(egn_extend_callout callout)
|
|
+ {
|
|
+ g_egn_extend_callout = callout;
|
|
+ }
|
|
|
|
! #if defined COMPILE_PCRE8
|
|
! __attribute__((visibility("default"))) PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
|
|
! egn_pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
|
|
! PCRE_SPTR subject, int length, int start_offset, int options, int *offsets, int offsetcount)
|
|
! {
|
|
! return pcre_exec(argument_re, extra_data, subject, length, start_offset,
|
|
! options, offsets, offsetcount);
|
|
! }
|
|
! #endif
|
|
! #endif
|
|
/*************************************************
|
|
* Match a back-reference *
|
|
*************************************************/
|
|
***************
|
|
*** 1729,1734 ****
|
|
--- 1744,1754 ----
|
|
cb.mark = md->nomatch_mark;
|
|
if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);
|
|
if (rrc < 0) RRETURN(rrc);
|
|
+ #if defined SUPPORT_EGN_MODE
|
|
+ if (g_egn_extend_callout != NULL) {
|
|
+ eptr = g_egn_extend_callout(md->start_subject, cb.current_position);
|
|
+ }
|
|
+ #endif
|
|
}
|
|
ecode += 2 + 2*LINK_SIZE;
|
|
break;
|
|
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/pcre_globals.c pcre_h3/pcre_globals.c
|
|
*** pcre/pcre_globals.c 2022-08-26 14:59:03.252000000 +0800
|
|
--- pcre_h3/pcre_globals.c 2022-08-26 14:58:53.936000000 +0800
|
|
***************
|
|
*** 83,86 ****
|
|
--- 83,96 ----
|
|
PCRE_EXP_DATA_DEFN int (*PUBL(stack_guard))(void) = NULL;
|
|
#endif
|
|
|
|
+ #if defined SUPPORT_EGN_MODE
|
|
+ __attribute__((visibility("default"))) void egn_init_pcre_reg(egn_generic_callout generic_callout,
|
|
+ egn_malloc_callout egn_malloc, egn_free_callout egn_free)
|
|
+ {
|
|
+ PUBL(malloc) = egn_malloc;
|
|
+ PUBL(free) = egn_free;
|
|
+ PUBL(callout) = generic_callout;
|
|
+ }
|
|
+ #endif
|
|
+
|
|
/* End of pcre_globals.c */
|
|
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/pcre.h.in pcre_h3/pcre.h.in
|
|
*** pcre/pcre.h.in 2022-08-26 14:59:03.244000000 +0800
|
|
--- pcre_h3/pcre.h.in 2022-08-26 14:58:53.932000000 +0800
|
|
***************
|
|
*** 670,675 ****
|
|
--- 670,703 ----
|
|
PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void);
|
|
PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void);
|
|
|
|
+ /* 支持应用感知组件能力增强的宏控制开关,主要涉及?F扩展,内存处理函数注册,对外接口封装 */
|
|
+ #if defined SUPPORT_EGN_MODE
|
|
+ typedef int (*egn_read_atomic_callout)(const char *pattern,
|
|
+ const char **calloutPos, int *length, unsigned int *is_saved);
|
|
+ typedef unsigned char *(*egn_extend_callout)(const unsigned char *start_subject, int offset);
|
|
+ typedef int (*egn_generic_callout)(pcre_callout_block *callout_block);
|
|
+ typedef void *(*egn_malloc_callout)(size_t size);
|
|
+ typedef void (*egn_free_callout)(void *addr);
|
|
+ void egn_init_pcrex_callout(egn_read_atomic_callout read_atomic_callout,
|
|
+ egn_extend_callout callout);
|
|
+ void egn_init_extend_callout(egn_extend_callout callout);
|
|
+ void egn_init_pcre_reg(egn_generic_callout generic_callout,
|
|
+ egn_malloc_callout egn_malloc, egn_free_callout egn_free);
|
|
+
|
|
+ PCRE_EXP_DECL pcre *egn_pcre_compile2(const char *, int, int *, const char **,
|
|
+ int *, const unsigned char *);
|
|
+ PCRE_EXP_DECL pcre_extra *egn_pcre_study(const pcre *, int, const char **);
|
|
+ PCRE_EXP_DECL int egn_pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,
|
|
+ int, int, int, int *, int);
|
|
+ #endif
|
|
+
|
|
+ #ifdef SLJIT_SUPPORT_CUSTOM_ALLOC
|
|
+ typedef void* (*pcre_alloc_t)(size_t size);
|
|
+ typedef void (*pcre_free_t)(void *ptr);
|
|
+ void sljit_set_allocator_extra(pcre_alloc_t alloc_func, pcre_free_t free_func);
|
|
+ int pcre_set_chartables_ext(unsigned char *tbl, int size);
|
|
+ int pcre_get_chartables_size();
|
|
+ #endif
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/pcre_study.c pcre_h3/pcre_study.c
|
|
*** pcre/pcre_study.c 2022-08-26 14:59:03.256000000 +0800
|
|
--- pcre_h3/pcre_study.c 2022-08-26 14:58:53.940000000 +0800
|
|
***************
|
|
*** 1424,1431 ****
|
|
return yield;
|
|
}
|
|
|
|
!
|
|
!
|
|
|
|
|
|
/*************************************************
|
|
--- 1424,1438 ----
|
|
return yield;
|
|
}
|
|
|
|
! #if defined SUPPORT_EGN_MODE
|
|
! #if defined COMPILE_PCRE8
|
|
! __attribute__((visibility("default"))) PCRE_EXP_DEFN pcre_extra * PCRE_CALL_CONVENTION
|
|
! egn_pcre_study(const pcre *external_re, int options, const char **errorptr)
|
|
! {
|
|
! return pcre_study(external_re, options, errorptr);
|
|
! }
|
|
! #endif
|
|
! #endif
|
|
|
|
|
|
/*************************************************
|
|
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' pcre/sljit/sljitExecAllocator.c pcre_h3/sljit/sljitExecAllocator.c
|
|
*** pcre/sljit/sljitExecAllocator.c 2022-08-26 14:59:03.260000000 +0800
|
|
--- pcre_h3/sljit/sljitExecAllocator.c 2022-08-26 14:58:53.944000000 +0800
|
|
***************
|
|
*** 239,246 ****
|
|
--- 239,260 ----
|
|
}
|
|
}
|
|
|
|
+ #ifdef SLJIT_SUPPORT_CUSTOM_ALLOC
|
|
+ void* (*g_sljit_malloc_exec)(sljit_uw size) = NULL;
|
|
+ void (*g_sljit_free_exec)(void *ptr) = NULL;
|
|
+ void sljit_set_allocator_extra(pcre_alloc_t alloc_func, pcre_free_t free_func)
|
|
+ {
|
|
+ g_sljit_malloc_exec = alloc_func;
|
|
+ g_sljit_free_exec = free_func;
|
|
+ }
|
|
+ #endif
|
|
SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size)
|
|
{
|
|
+ #ifdef SLJIT_SUPPORT_CUSTOM_ALLOC
|
|
+ if (g_sljit_malloc_exec) {
|
|
+ return g_sljit_malloc_exec(size);
|
|
+ }
|
|
+ #endif
|
|
struct block_header *header;
|
|
struct block_header *next_header;
|
|
struct free_block *free_block;
|
|
***************
|
|
*** 312,317 ****
|
|
--- 326,337 ----
|
|
|
|
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr)
|
|
{
|
|
+ #ifdef SLJIT_SUPPORT_CUSTOM_ALLOC
|
|
+ if (g_sljit_free_exec) {
|
|
+ g_sljit_free_exec(ptr);
|
|
+ return;
|
|
+ }
|
|
+ #endif
|
|
struct block_header *header;
|
|
struct free_block* free_block;
|
|
|
|
***************
|
|
*** 357,362 ****
|
|
--- 377,388 ----
|
|
|
|
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void)
|
|
{
|
|
+ #ifdef SLJIT_SUPPORT_CUSTOM_ALLOC
|
|
+ if (g_sljit_malloc_exec) {
|
|
+ /* nothing to free if malloc is customized. */
|
|
+ return;
|
|
+ }
|
|
+ #endif
|
|
struct free_block* free_block;
|
|
struct free_block* next_free_block;
|
|
|