pcre2_config: address inconsistency with the linksize reported in non 8-bit libraries (#775)

pcre2_config: add PCRE2_CONFIG_EFFECTIVE_LINKSIZE

PCRE2_CONFIG_LINKSIZE can be used to determine the linksize that the
library was configured to use, but the actual size (and therefore
the maximum size of patterns that can be processed) is not visible.

Add PCRE2_CONFIG_EFFECTIVE_LINKSIZE to gather that value and use it
in `pcre2test` for reporting `linksize`; move the logic to derive
one from the other out of the API documentation and test scripts to
improve maintainability and while at it enable test8 in Windows for
all link sizes.
This commit is contained in:
Carlo Marcelo Arenas Belón
2025-08-29 03:37:36 -07:00
committed by GitHub
parent 859d833467
commit ec48bfc070
8 changed files with 150 additions and 105 deletions

21
RunTest
View File

@@ -337,19 +337,6 @@ while [ $# -gt 0 ] ; do
shift
done
# Find which optional facilities are available.
$sim $pcre2test -C linksize >/dev/null
link_size=$?
if [ $link_size -lt 2 ] ; then
echo "RunTest: Failed to find internal link size"
exit 1
fi
if [ $link_size -gt 4 ] ; then
echo "RunTest: Failed to find internal link size"
exit 1
fi
# If it is possible to set the system stack size and -bigstack was given,
# set up a large stack.
@@ -725,12 +712,8 @@ for bmode in "$test8" "$test16" "$test32"; do
if [ $do8 = yes ] ; then
echo $title8
bits_link_size=$link_size
if [ $bits = "16" -a $link_size = "3" ] ; then
bits_link_size=4
elif [ $bits = "32" ] ; then
bits_link_size=4
fi
$sim $pcre2test -$bits -C linksize >/dev/null
bits_link_size=$?
if [ $utf -eq 0 ] ; then
echo " Skipped because UTF-$bits support is not available"
else

View File

@@ -1,8 +1,7 @@
@echo off
@rem
@rem MS Windows batch file to run pcre2test on testfiles with the correct
@rem options. This file must use CRLF linebreaks to function properly,
@rem and requires both pcre2test and pcre2grep.
@rem options. This file must use CRLF linebreaks to function properly.
@rem
@rem ------------------------ HISTORY ----------------------------------
@rem This file was originally contributed to PCRE1 by Ralf Junker, and touched
@@ -14,7 +13,7 @@
@rem
@rem Sheri Pierce added logic to skip feature dependent tests
@rem tests 4 5 7 10 12 14 19 22 25 and 26 require Unicode support
@rem 8 requires Unicode and link size 2
@rem 8 requires Unicode
@rem 16 requires absence of jit support
@rem 17 requires presence of jit support
@rem Sheri P also added override tests for study and jit testing
@@ -57,8 +56,6 @@ call :conferror
exit /b 1
)
%pcre2test% -C linksize >NUL
set link_size=%ERRORLEVEL%
%pcre2test% -C pcre2-8 >NUL
set support8=%ERRORLEVEL%
%pcre2test% -C pcre2-16 >NUL
@@ -269,9 +266,8 @@ if [%3] == [] (
)
if %1 == 8 (
set bits_link_size=%link_size%
if %bits% EQU 16 if %link_size% EQU 3 set bits_link_size=4
if %bits% EQU 32 set bits_link_size=4
%pcre2test% -%bits% -C linksize >NUL
set bits_link_size=!ERRORLEVEL!
set outnum=%1-%bits%-!bits_link_size!
) else if %1 == 11 (
set outnum=%1-%bits%
@@ -379,10 +375,6 @@ if %unicode% EQU 0 (
goto :eof
:do8
if NOT %link_size% EQU 2 (
echo Test 8 Skipped because link size is not 2.
goto :eof
)
if %unicode% EQU 0 (
echo Test 8 Skipped due to absence of Unicode support.
goto :eof

View File

@@ -129,7 +129,7 @@ in the library.
<td>Free a compile context</td></tr>
<tr><td><a href="pcre2_config.html">pcre2_config</a></td>
<td>Show build-time configuration options</td></tr>
<td>Show build-time related configuration options</td></tr>
<tr><td><a href="pcre2_convert_context_copy.html">pcre2_convert_context_copy</a></td>
<td>Copy a convert context</td></tr>

View File

@@ -29,36 +29,37 @@ PCRE2_CONFIG_UNICODE_VERSION, and PCRE2_CONFIG_VERSION it must point to a
buffer that is large enough to hold the string. For all other codes it must
point to a uint32_t integer variable. The available codes are:
.sp
PCRE2_CONFIG_BSR Indicates what \eR matches by default:
PCRE2_BSR_UNICODE
PCRE2_BSR_ANYCRLF
PCRE2_CONFIG_COMPILED_WIDTHS Which of 8/16/32 support was compiled
PCRE2_CONFIG_DEPTHLIMIT Default backtracking depth limit
PCRE2_CONFIG_HEAPLIMIT Default heap memory limit
PCRE2_CONFIG_BSR Indicates what \eR matches by default:
PCRE2_BSR_UNICODE
PCRE2_BSR_ANYCRLF
PCRE2_CONFIG_COMPILED_WIDTHS Which of 8/16/32 support was compiled
PCRE2_CONFIG_DEPTHLIMIT Default backtracking depth limit
PCRE2_CONFIG_EFFECTIVE_LINKSIZE How many bytes are used for link size
PCRE2_CONFIG_HEAPLIMIT Default heap memory limit
.\" JOIN
PCRE2_CONFIG_JIT Availability of just-in-time compiler
support (1=yes 0=no)
PCRE2_CONFIG_JIT Availability of just-in-time compiler
support (1=yes 0=no)
.\" JOIN
PCRE2_CONFIG_JITTARGET Information (a string) about the target
architecture for the JIT compiler
PCRE2_CONFIG_LINKSIZE Configured internal link size (2, 3, 4)
PCRE2_CONFIG_MATCHLIMIT Default internal resource limit
PCRE2_CONFIG_JITTARGET Information (a string) about the target
architecture for the JIT compiler
PCRE2_CONFIG_LINKSIZE Configured internal link size (2, 3, 4)
PCRE2_CONFIG_MATCHLIMIT Default internal resource limit
PCRE2_CONFIG_NEVER_BACKSLASH_C Whether or not \eC is disabled
PCRE2_CONFIG_NEWLINE Code for the default newline sequence:
PCRE2_NEWLINE_CR
PCRE2_NEWLINE_LF
PCRE2_NEWLINE_CRLF
PCRE2_NEWLINE_ANY
PCRE2_NEWLINE_ANYCRLF
PCRE2_NEWLINE_NUL
PCRE2_CONFIG_PARENSLIMIT Default parentheses nesting limit
PCRE2_CONFIG_RECURSIONLIMIT Obsolete: use PCRE2_CONFIG_DEPTHLIMIT
PCRE2_CONFIG_STACKRECURSE Obsolete: always returns 0
PCRE2_CONFIG_NEWLINE Code for the default newline sequence:
PCRE2_NEWLINE_CR
PCRE2_NEWLINE_LF
PCRE2_NEWLINE_CRLF
PCRE2_NEWLINE_ANY
PCRE2_NEWLINE_ANYCRLF
PCRE2_NEWLINE_NUL
PCRE2_CONFIG_PARENSLIMIT Default parentheses nesting limit
PCRE2_CONFIG_RECURSIONLIMIT Obsolete: use PCRE2_CONFIG_DEPTHLIMIT
PCRE2_CONFIG_STACKRECURSE Obsolete: always returns 0
.\" JOIN
PCRE2_CONFIG_UNICODE Availability of Unicode support (1=yes
0=no)
PCRE2_CONFIG_UNICODE_VERSION The Unicode version (a string)
PCRE2_CONFIG_VERSION The PCRE2 version (a string)
PCRE2_CONFIG_UNICODE Availability of Unicode support
(1=yes 0=no)
PCRE2_CONFIG_UNICODE_VERSION The Unicode version (a string)
PCRE2_CONFIG_VERSION The PCRE2 version (a string)
.sp
The function yields a non-negative value on success or the negative value
PCRE2_ERROR_BADOPTION otherwise. This is also the result for the

View File

@@ -497,7 +497,7 @@ compiled patterns on disc or elsewhere, and reloading them later.
.P
Finally, there are functions for finding out information about a compiled
pattern (\fBpcre2_pattern_info()\fP) and about the configuration with which
PCRE2 was built (\fBpcre2_config()\fP).
PCRE2 was built (\fBpcre2_config()\fP) and that it is using.
.P
Functions with names ending with \fB_free()\fP are used for freeing memory
blocks of various sorts. In all cases, if one of these functions is called with
@@ -1265,6 +1265,13 @@ The output is a uint32_t integer that gives the default limit for the depth of
nested backtracking in \fBpcre2_match()\fP or the depth of nested recursions,
lookarounds, and atomic groups in \fBpcre2_dfa_match()\fP. Further details are
given with \fBpcre2_set_depth_limit()\fP above.
.sp
PCRE2_CONFIG_EFFECTIVE_LINKSIZE
.sp
The output is a uint32_t integer that contains the number of bytes the library
uses for internal linkage in compiled regular expressions. Its value is derived
from the value that was provided at build time and that is described below by
PCRE2_CONFIG_LINKSIZE.
.sp
PCRE2_CONFIG_HEAPLIMIT
.sp
@@ -1300,13 +1307,14 @@ for the terminating zero.
.sp
PCRE2_CONFIG_LINKSIZE
.sp
The output is a uint32_t integer that contains the number of bytes used for
internal linkage in compiled regular expressions. When PCRE2 is configured, the
value can be set to 2, 3, or 4, with the default being 2. This is the value
that is returned by \fBpcre2_config()\fP. However, when the 16-bit library is
compiled, a value of 3 is rounded up to 4, and when the 32-bit library is
compiled, internal linkages always use 4 bytes, so the configured value is not
relevant.
The output is a uint32_t integer that contains the number of bytes the library
was instructed to use for internal linkage in compiled regular expressions.
When PCRE2 is configured, the value can be set to 2, 3, or 4, with the default
being 2 for most libraries.
.P
The actual number of bytes used depends on the size of the code units that the
library supports and can be higher. See PCRE2_CONFIG_EFFECTIVE_LINKSIZE above
for details.
.P
The default value of 2 for the 8-bit and 16-bit libraries is sufficient for all
but the most massive patterns, since it allows the size of the compiled pattern

View File

@@ -487,6 +487,7 @@ released, the numbers must not be changed. */
#define PCRE2_CONFIG_NEVER_BACKSLASH_C 13
#define PCRE2_CONFIG_COMPILED_WIDTHS 14
#define PCRE2_CONFIG_TABLES_LENGTH 15
#define PCRE2_CONFIG_EFFECTIVE_LINKSIZE 16
/* Optimization directives for pcre2_set_optimize().
For binary compatibility, only add to this list; do not renumber. */

View File

@@ -72,7 +72,7 @@ pcre2_config(uint32_t what, void *where)
{
if (where == NULL) /* Requests a length */
{
switch(what)
switch (what)
{
default:
return PCRE2_ERROR_BADOPTION;
@@ -80,6 +80,7 @@ if (where == NULL) /* Requests a length */
case PCRE2_CONFIG_BSR:
case PCRE2_CONFIG_COMPILED_WIDTHS:
case PCRE2_CONFIG_DEPTHLIMIT:
case PCRE2_CONFIG_EFFECTIVE_LINKSIZE:
case PCRE2_CONFIG_HEAPLIMIT:
case PCRE2_CONFIG_JIT:
case PCRE2_CONFIG_LINKSIZE:
@@ -117,13 +118,13 @@ switch (what)
case PCRE2_CONFIG_COMPILED_WIDTHS:
*((uint32_t *)where) = 0
#ifdef SUPPORT_PCRE2_8
+ 1
+ (1 << 0)
#endif
#ifdef SUPPORT_PCRE2_16
+ 2
+ (1 << 1)
#endif
#ifdef SUPPORT_PCRE2_32
+ 4
+ (1 << 2)
#endif
;
break;
@@ -132,6 +133,10 @@ switch (what)
*((uint32_t *)where) = MATCH_LIMIT_DEPTH;
break;
case PCRE2_CONFIG_EFFECTIVE_LINKSIZE:
*((uint32_t *)where) = LINK_SIZE * sizeof(PCRE2_UCHAR);
break;
case PCRE2_CONFIG_HEAPLIMIT:
*((uint32_t *)where) = HEAP_LIMIT;
break;
@@ -199,8 +204,7 @@ switch (what)
#endif
return (int)(1 + ((where == NULL)?
strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
}
break;
}
case PCRE2_CONFIG_UNICODE:
#if defined SUPPORT_UNICODE
@@ -237,6 +241,7 @@ switch (what)
return (int)(1 + ((where == NULL)?
strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
}
}
return 0;

View File

@@ -413,7 +413,6 @@ modes, so use the form of the first that is available. */
#if defined SUPPORT_PCRE2_8
#define DEFAULT_TEST_MODE PCRE8_MODE
#define VERSION_TYPE PCRE2_UCHAR8
#define PCRE2_CONFIG pcre2_config_8
#define PCRE2_JIT_STACK pcre2_jit_stack_8
#define PCRE2_REAL_GENERAL_CONTEXT pcre2_real_general_context_8
#define PCRE2_REAL_COMPILE_CONTEXT pcre2_real_compile_context_8
@@ -423,7 +422,6 @@ modes, so use the form of the first that is available. */
#elif defined SUPPORT_PCRE2_16
#define DEFAULT_TEST_MODE PCRE16_MODE
#define VERSION_TYPE PCRE2_UCHAR16
#define PCRE2_CONFIG pcre2_config_16
#define PCRE2_JIT_STACK pcre2_jit_stack_16
#define PCRE2_REAL_GENERAL_CONTEXT pcre2_real_general_context_16
#define PCRE2_REAL_COMPILE_CONTEXT pcre2_real_compile_context_16
@@ -433,7 +431,6 @@ modes, so use the form of the first that is available. */
#elif defined SUPPORT_PCRE2_32
#define DEFAULT_TEST_MODE PCRE32_MODE
#define VERSION_TYPE PCRE2_UCHAR32
#define PCRE2_CONFIG pcre2_config_32
#define PCRE2_JIT_STACK pcre2_jit_stack_32
#define PCRE2_REAL_GENERAL_CONTEXT pcre2_real_general_context_32
#define PCRE2_REAL_COMPILE_CONTEXT pcre2_real_compile_context_32
@@ -996,7 +993,7 @@ static coptstruct coptlist[] = {
{ "ebcdic-nl25", CONF_FIX, SUPPORT_EBCDIC_NL25 },
{ "jit", CONF_INT, PCRE2_CONFIG_JIT },
{ "jitusable", CONF_JU, 0 },
{ "linksize", CONF_INT, PCRE2_CONFIG_LINKSIZE },
{ "linksize", CONF_INT, PCRE2_CONFIG_EFFECTIVE_LINKSIZE },
{ "newline", CONF_NL, PCRE2_CONFIG_NEWLINE },
{ "pcre2-16", CONF_FIX, SUPPORT_16 },
{ "pcre2-32", CONF_FIX, SUPPORT_32 },
@@ -1270,6 +1267,22 @@ are supported. */
else \
G(a,32) = pcre2_compile_32(b,c,d,e,f,g)
#define PCRE2_CONFIG(lv,a,b) \
if (test_mode == PCRE8_MODE) \
lv = pcre2_config_8(a,b); \
else if (test_mode == PCRE16_MODE) \
lv = pcre2_config_16(a,b); \
else \
lv = pcre2_config_32(a,b)
#define PCRE2_CONFIGV(a,b) \
if (test_mode == PCRE8_MODE) \
(void)pcre2_config_8(a,b); \
else if (test_mode == PCRE16_MODE) \
(void)pcre2_config_16(a,b); \
else \
(void)pcre2_config_32(a,b)
#define PCRE2_CONVERTED_PATTERN_FREE(a) \
if (test_mode == PCRE8_MODE) pcre2_converted_pattern_free_8((PCRE2_UCHAR8 *)a); \
else if (test_mode == PCRE16_MODE) pcre2_converted_pattern_free_16((PCRE2_UCHAR16 *)a); \
@@ -1852,6 +1865,18 @@ the three different cases. */
else \
G(a,BITTWO) = G(pcre2_compile_,BITTWO)(b,c,d,e,f,g)
#define PCRE2_CONFIG(lv,a,b) \
if (test_mode == G(G(PCRE,BITONE),_MODE)) \
lv = G(pcre2_config_,BITONE)(a,b); \
else \
lv = G(pcre2_config_,BITTWO)(a,b)
#define PCRE2_CONFIGV(a,b) \
if (test_mode == G(G(PCRE,BITONE),_MODE)) \
(void)G(pcre2_config_,BITONE)(a,b); \
else \
(void)G(pcre2_config_,BITTWO)(a,b)
#define PCRE2_CONVERTED_PATTERN_FREE(a) \
if (test_mode == G(G(PCRE,BITONE),_MODE)) \
G(pcre2_converted_pattern_free_,BITONE)((G(PCRE2_UCHAR,BITONE) *)a); \
@@ -2267,6 +2292,8 @@ the three different cases. */
#define PCRE2_CODE_COPY_TO_VOID(a,b) a = (void *)pcre2_code_copy_8(G(b,8))
#define PCRE2_CODE_COPY_WITH_TABLES_TO_VOID(a,b) a = (void *)pcre2_code_copy_with_tables_8(G(b,8))
#define PCRE2_COMPILE(a,b,c,d,e,f,g) G(a,8) = pcre2_compile_8(b,c,d,e,f,g)
#define PCRE2_CONFIG(lv,a,b) lv = pcre2_config_8(a,b)
#define PCRE2_CONFIGV(a,b) (void)pcre2_config_8(a,b)
#define PCRE2_CONVERTED_PATTERN_FREE(a) \
pcre2_converted_pattern_free_8((PCRE2_UCHAR8 *)a)
#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
@@ -2384,6 +2411,8 @@ the three different cases. */
#define PCRE2_CODE_COPY_TO_VOID(a,b) a = (void *)pcre2_code_copy_16(G(b,16))
#define PCRE2_CODE_COPY_WITH_TABLES_TO_VOID(a,b) a = (void *)pcre2_code_copy_with_tables_16(G(b,16))
#define PCRE2_COMPILE(a,b,c,d,e,f,g) G(a,16) = pcre2_compile_16(b,c,d,e,f,g)
#define PCRE2_CONFIG(lv,a,b) lv = pcre2_config_16(a,b)
#define PCRE2_CONFIGV(a,b) (void)pcre2_config_16(a,b)
#define PCRE2_CONVERTED_PATTERN_FREE(a) \
pcre2_converted_pattern_free_16((PCRE2_UCHAR16 *)a)
#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
@@ -2499,6 +2528,8 @@ the three different cases. */
#define PCRE2_CODE_COPY_TO_VOID(a,b) a = (void *)pcre2_code_copy_32(G(b,32))
#define PCRE2_CODE_COPY_WITH_TABLES_TO_VOID(a,b) a = (void *)pcre2_code_copy_with_tables_32(G(b,32))
#define PCRE2_COMPILE(a,b,c,d,e,f,g) G(a,32) = pcre2_compile_32(b,c,d,e,f,g)
#define PCRE2_CONFIG(lv,a,b) lv = pcre2_config_32(a,b)
#define PCRE2_CONFIGV(a,b) (void)pcre2_config_32(a,b)
#define PCRE2_CONVERTED_PATTERN_FREE(a) \
pcre2_converted_pattern_free_32((PCRE2_UCHAR32 *)a)
#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
@@ -5881,13 +5912,14 @@ switch(cmd)
if (tables3 == NULL)
{
(void)PCRE2_CONFIG(PCRE2_CONFIG_TABLES_LENGTH, &loadtables_length);
tables3 = malloc(loadtables_length);
int r;
PCRE2_CONFIG(r, PCRE2_CONFIG_TABLES_LENGTH, &loadtables_length);
if (r >= 0) tables3 = malloc(loadtables_length);
}
if (tables3 == NULL)
{
fprintf(outfile, "** Failed: malloc failed for #loadtables\n");
fprintf(outfile, "** Failed: malloc/config for #loadtables\n");
yield = PR_ABEND;
}
else if (fread(tables3, 1, loadtables_length, f) != loadtables_length)
@@ -9796,7 +9828,7 @@ if (arg != NULL && arg[0] != '-')
switch (coptlist[i].type)
{
case CONF_BSR:
(void)PCRE2_CONFIG(coptlist[i].value, &optval);
PCRE2_CONFIGV(coptlist[i].value, &optval);
printf("%s\n", (optval == PCRE2_BSR_ANYCRLF)? "ANYCRLF" : "ANY");
break;
@@ -9806,12 +9838,12 @@ if (arg != NULL && arg[0] != '-')
break;
case CONF_INT:
(void)PCRE2_CONFIG(coptlist[i].value, &yield);
PCRE2_CONFIGV(coptlist[i].value, &yield);
printf("%d\n", yield);
break;
case CONF_NL:
(void)PCRE2_CONFIG(coptlist[i].value, &optval);
PCRE2_CONFIGV(coptlist[i].value, &optval);
print_newline_config(optval, TRUE);
break;
@@ -9881,7 +9913,7 @@ printf(" Input/output for pcre2test is ASCII, not EBCDIC\n");
#endif
#endif
(void)PCRE2_CONFIG(PCRE2_CONFIG_COMPILED_WIDTHS, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_COMPILED_WIDTHS, &optval);
if (optval & 1) printf(" 8-bit support\n");
if (optval & 2) printf(" 16-bit support\n");
if (optval & 4) printf(" 32-bit support\n");
@@ -9890,7 +9922,7 @@ if (optval & 4) printf(" 32-bit support\n");
printf(" Valgrind support\n");
#endif
(void)PCRE2_CONFIG(PCRE2_CONFIG_UNICODE, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_UNICODE, &optval);
if (optval != 0)
{
printf(" UTF and UCP support (");
@@ -9899,7 +9931,7 @@ if (optval != 0)
}
else printf(" No Unicode support\n");
(void)PCRE2_CONFIG(PCRE2_CONFIG_JIT, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_JIT, &optval);
if (optval != 0)
{
printf(" Just-in-time compiler support\n");
@@ -9932,23 +9964,26 @@ else
printf(" No just-in-time compiler support\n");
}
(void)PCRE2_CONFIG(PCRE2_CONFIG_NEWLINE, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_NEWLINE, &optval);
print_newline_config(optval, FALSE);
(void)PCRE2_CONFIG(PCRE2_CONFIG_BSR, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_BSR, &optval);
printf(" \\R matches %s\n",
(optval == PCRE2_BSR_ANYCRLF)? "CR, LF, or CRLF only" :
"all Unicode newlines");
(void)PCRE2_CONFIG(PCRE2_CONFIG_NEVER_BACKSLASH_C, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_NEVER_BACKSLASH_C, &optval);
printf(" \\C is %ssupported\n", optval? "not ":"");
(void)PCRE2_CONFIG(PCRE2_CONFIG_LINKSIZE, &optval);
printf(" Internal link size = %d\n", optval);
(void)PCRE2_CONFIG(PCRE2_CONFIG_PARENSLIMIT, &optval);
printf(" Internal link size\n");
PCRE2_CONFIGV(PCRE2_CONFIG_LINKSIZE, &optval);
printf(" Requested = %d\n", optval);
PCRE2_CONFIGV(PCRE2_CONFIG_EFFECTIVE_LINKSIZE, &optval);
printf(" Effective = %d\n", optval);
PCRE2_CONFIGV(PCRE2_CONFIG_PARENSLIMIT, &optval);
printf(" Parentheses nest limit = %d\n", optval);
(void)PCRE2_CONFIG(PCRE2_CONFIG_HEAPLIMIT, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_HEAPLIMIT, &optval);
printf(" Default heap limit = %d kibibytes\n", optval);
(void)PCRE2_CONFIG(PCRE2_CONFIG_MATCHLIMIT, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_MATCHLIMIT, &optval);
printf(" Default match limit = %d\n", optval);
(void)PCRE2_CONFIG(PCRE2_CONFIG_DEPTHLIMIT, &optval);
PCRE2_CONFIGV(PCRE2_CONFIG_DEPTHLIMIT, &optval);
printf(" Default depth limit = %d\n", optval);
#if defined SUPPORT_LIBREADLINE
@@ -10247,6 +10282,7 @@ display_selected_modifiers(FALSE, "SUBJECT");
int
main(int argc, char **argv)
{
int r1, r2;
uint32_t temp;
uint32_t yield = 0;
uint32_t op = 1;
@@ -10277,17 +10313,33 @@ if (PO(options) != DO(options) || PO(control) != DO(control) ||
same time checking that a request for the length gives the same answer. Also
check lengths for non-string items. */
if (PCRE2_CONFIG(PCRE2_CONFIG_VERSION, NULL) !=
PCRE2_CONFIG(PCRE2_CONFIG_VERSION, version) ||
PCRE2_CONFIG(r1, PCRE2_CONFIG_VERSION, NULL);
PCRE2_CONFIG(r2, PCRE2_CONFIG_VERSION, version);
if (r1 != r2)
{
fprintf(stderr, "** Error in pcre2_config(PCRE2_CONFIG_VERSION): bad length\n");
return 1;
}
PCRE2_CONFIG(PCRE2_CONFIG_UNICODE_VERSION, NULL) !=
PCRE2_CONFIG(PCRE2_CONFIG_UNICODE_VERSION, uversion) ||
PCRE2_CONFIG(r1, PCRE2_CONFIG_UNICODE_VERSION, NULL);
PCRE2_CONFIG(r2, PCRE2_CONFIG_UNICODE_VERSION, uversion);
if (r1 != r2)
{
fprintf(stderr, "** Error in pcre2_config(PCRE2_CONFIG_UNICODE_VERSION): bad length\n");
return 1;
}
PCRE2_CONFIG(PCRE2_CONFIG_JITTARGET, NULL) !=
PCRE2_CONFIG(PCRE2_CONFIG_JITTARGET, jittarget) ||
PCRE2_CONFIG(r1, PCRE2_CONFIG_JITTARGET, NULL);
PCRE2_CONFIG(r2, PCRE2_CONFIG_JITTARGET, jittarget);
if (r1 != r2)
{
fprintf(stderr, "** Error in pcre2_config(PCRE2_CONFIG_JITTARGET): bad length\n");
return 1;
}
PCRE2_CONFIG(PCRE2_CONFIG_UNICODE, NULL) != sizeof(uint32_t) ||
PCRE2_CONFIG(PCRE2_CONFIG_MATCHLIMIT, NULL) != sizeof(uint32_t))
PCRE2_CONFIG(r1, PCRE2_CONFIG_UNICODE, NULL);
PCRE2_CONFIG(r2, PCRE2_CONFIG_MATCHLIMIT, NULL);
if (r1 != r2 || r1 != sizeof(uint32_t))
{
fprintf(stderr, "** Error in pcre2_config(): bad length\n");
return 1;
@@ -10295,8 +10347,10 @@ if (PCRE2_CONFIG(PCRE2_CONFIG_VERSION, NULL) !=
/* Check that bad options are diagnosed. */
if (PCRE2_CONFIG(999, NULL) != PCRE2_ERROR_BADOPTION ||
PCRE2_CONFIG(999, &temp) != PCRE2_ERROR_BADOPTION)
PCRE2_CONFIG(r1, 999, NULL);
PCRE2_CONFIG(r2, 999, &temp);
if (r1 != r2 || r2 != PCRE2_ERROR_BADOPTION)
{
fprintf(stderr, "** Error in pcre2_config(): bad option not diagnosed\n");
return 1;
@@ -10305,7 +10359,8 @@ if (PCRE2_CONFIG(999, NULL) != PCRE2_ERROR_BADOPTION ||
/* This configuration option is now obsolete, but running a quick check ensures
that its code is covered. */
(void)PCRE2_CONFIG(PCRE2_CONFIG_STACKRECURSE, &temp);
PCRE2_CONFIGV(PCRE2_CONFIG_STACKRECURSE, &temp);
PCRE2_CONFIGV(PCRE2_CONFIG_LINKSIZE, &temp);
/* Get buffers from malloc() so that valgrind will check their misuse when
debugging. They grow automatically when very long lines are read. The 16-