Add options for NULL pointers to pcre2test.
This commit is contained in:
parent
16dccbcb13
commit
cb854a912e
|
@ -28,6 +28,8 @@ from pcre2grep.
|
||||||
9. Merged patch from @carenas (GitHub #53) fixing NULL checks in matching and
|
9. Merged patch from @carenas (GitHub #53) fixing NULL checks in matching and
|
||||||
substituting.
|
substituting.
|
||||||
|
|
||||||
|
10. Add null_subject and null_replacement modifiers to pcre2test.
|
||||||
|
|
||||||
|
|
||||||
Version 10.39 29-October-2021
|
Version 10.39 29-October-2021
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
|
@ -3655,7 +3655,9 @@ default.
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
PCRE2_ERROR_NULL is returned if PCRE2_SUBSTITUTE_MATCHED is set but the
|
PCRE2_ERROR_NULL is returned if PCRE2_SUBSTITUTE_MATCHED is set but the
|
||||||
<i>match_data</i> argument is NULL.
|
<i>match_data</i> argument is NULL or if the <i>subject</i> or <i>replacement</i>
|
||||||
|
arguments are NULL. For backward compatibility reasons an exception is made for
|
||||||
|
the <i>replacement</i> argument if the <i>rlength</i> argument is also 0.
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax errors in the
|
PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax errors in the
|
||||||
|
|
|
@ -1239,6 +1239,8 @@ pattern, but can be overridden by modifiers on the subject.
|
||||||
match_limit=<n> set a match limit
|
match_limit=<n> set a match limit
|
||||||
memory show heap memory usage
|
memory show heap memory usage
|
||||||
null_context match with a NULL context
|
null_context match with a NULL context
|
||||||
|
null_replacement substitute with NULL replacement
|
||||||
|
null_subject match with NULL subject
|
||||||
offset=<n> set starting offset
|
offset=<n> set starting offset
|
||||||
offset_limit=<n> set offset limit
|
offset_limit=<n> set offset limit
|
||||||
ovector=<n> set size of output vector
|
ovector=<n> set size of output vector
|
||||||
|
@ -1668,7 +1670,7 @@ When testing <b>pcre2_substitute()</b>, this modifier also has the effect of
|
||||||
passing the replacement string as zero-terminated.
|
passing the replacement string as zero-terminated.
|
||||||
</P>
|
</P>
|
||||||
<br><b>
|
<br><b>
|
||||||
Passing a NULL context
|
Passing a NULL context, subject, or replacement
|
||||||
</b><br>
|
</b><br>
|
||||||
<P>
|
<P>
|
||||||
Normally, <b>pcre2test</b> passes a context block to <b>pcre2_match()</b>,
|
Normally, <b>pcre2test</b> passes a context block to <b>pcre2_match()</b>,
|
||||||
|
@ -1678,6 +1680,11 @@ testing that the matching and substitution functions behave correctly in this
|
||||||
case (they use default values). This modifier cannot be used with the
|
case (they use default values). This modifier cannot be used with the
|
||||||
<b>find_limits</b> or <b>substitute_callout</b> modifiers.
|
<b>find_limits</b> or <b>substitute_callout</b> modifiers.
|
||||||
</P>
|
</P>
|
||||||
|
<P>
|
||||||
|
Similarly, for testing purposes, if the <b>null_subject</b> or
|
||||||
|
<b>null_replacement</b> modifier is set, the subject or replacement string
|
||||||
|
pointers are passed as NULL, respectively, to the relevant functions.
|
||||||
|
</P>
|
||||||
<br><a name="SEC12" href="#TOC1">THE ALTERNATIVE MATCHING FUNCTION</a><br>
|
<br><a name="SEC12" href="#TOC1">THE ALTERNATIVE MATCHING FUNCTION</a><br>
|
||||||
<P>
|
<P>
|
||||||
By default, <b>pcre2test</b> uses the standard PCRE2 matching function,
|
By default, <b>pcre2test</b> uses the standard PCRE2 matching function,
|
||||||
|
@ -2122,7 +2129,7 @@ Cambridge, England.
|
||||||
</P>
|
</P>
|
||||||
<br><a name="SEC21" href="#TOC1">REVISION</a><br>
|
<br><a name="SEC21" href="#TOC1">REVISION</a><br>
|
||||||
<P>
|
<P>
|
||||||
Last updated: 30 August 2021
|
Last updated: 28 November 2021
|
||||||
<br>
|
<br>
|
||||||
Copyright © 1997-2021 University of Cambridge.
|
Copyright © 1997-2021 University of Cambridge.
|
||||||
<br>
|
<br>
|
||||||
|
|
|
@ -3524,7 +3524,9 @@ CREATING A NEW STRING WITH SUBSTITUTIONS
|
||||||
does not happen by default.
|
does not happen by default.
|
||||||
|
|
||||||
PCRE2_ERROR_NULL is returned if PCRE2_SUBSTITUTE_MATCHED is set but the
|
PCRE2_ERROR_NULL is returned if PCRE2_SUBSTITUTE_MATCHED is set but the
|
||||||
match_data argument is NULL.
|
match_data argument is NULL or if the subject or replacement arguments
|
||||||
|
are NULL. For backward compatibility reasons an exception is made for
|
||||||
|
the replacement argument if the rlength argument is also 0.
|
||||||
|
|
||||||
PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax errors in
|
PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax errors in
|
||||||
the replacement string, with more particular errors being PCRE2_ER-
|
the replacement string, with more particular errors being PCRE2_ER-
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH PCRE2TEST 1 "30 August 2021" "PCRE 10.38"
|
.TH PCRE2TEST 1 "28 November 2021" "PCRE 10.40"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
pcre2test - a program for testing Perl-compatible regular expressions.
|
pcre2test - a program for testing Perl-compatible regular expressions.
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -1206,6 +1206,8 @@ pattern, but can be overridden by modifiers on the subject.
|
||||||
match_limit=<n> set a match limit
|
match_limit=<n> set a match limit
|
||||||
memory show heap memory usage
|
memory show heap memory usage
|
||||||
null_context match with a NULL context
|
null_context match with a NULL context
|
||||||
|
null_replacement substitute with NULL replacement
|
||||||
|
null_subject match with NULL subject
|
||||||
offset=<n> set starting offset
|
offset=<n> set starting offset
|
||||||
offset_limit=<n> set offset limit
|
offset_limit=<n> set offset limit
|
||||||
ovector=<n> set size of output vector
|
ovector=<n> set size of output vector
|
||||||
|
@ -1629,7 +1631,7 @@ When testing \fBpcre2_substitute()\fP, this modifier also has the effect of
|
||||||
passing the replacement string as zero-terminated.
|
passing the replacement string as zero-terminated.
|
||||||
.
|
.
|
||||||
.
|
.
|
||||||
.SS "Passing a NULL context"
|
.SS "Passing a NULL context, subject, or replacement"
|
||||||
.rs
|
.rs
|
||||||
.sp
|
.sp
|
||||||
Normally, \fBpcre2test\fP passes a context block to \fBpcre2_match()\fP,
|
Normally, \fBpcre2test\fP passes a context block to \fBpcre2_match()\fP,
|
||||||
|
@ -1638,6 +1640,10 @@ If the \fBnull_context\fP modifier is set, however, NULL is passed. This is for
|
||||||
testing that the matching and substitution functions behave correctly in this
|
testing that the matching and substitution functions behave correctly in this
|
||||||
case (they use default values). This modifier cannot be used with the
|
case (they use default values). This modifier cannot be used with the
|
||||||
\fBfind_limits\fP or \fBsubstitute_callout\fP modifiers.
|
\fBfind_limits\fP or \fBsubstitute_callout\fP modifiers.
|
||||||
|
.P
|
||||||
|
Similarly, for testing purposes, if the \fBnull_subject\fP or
|
||||||
|
\fBnull_replacement\fP modifier is set, the subject or replacement string
|
||||||
|
pointers are passed as NULL, respectively, to the relevant functions.
|
||||||
.
|
.
|
||||||
.
|
.
|
||||||
.SH "THE ALTERNATIVE MATCHING FUNCTION"
|
.SH "THE ALTERNATIVE MATCHING FUNCTION"
|
||||||
|
@ -2103,6 +2109,6 @@ Cambridge, England.
|
||||||
.rs
|
.rs
|
||||||
.sp
|
.sp
|
||||||
.nf
|
.nf
|
||||||
Last updated: 30 August 2021
|
Last updated: 28 November 2021
|
||||||
Copyright (c) 1997-2021 University of Cambridge.
|
Copyright (c) 1997-2021 University of Cambridge.
|
||||||
.fi
|
.fi
|
||||||
|
|
|
@ -1111,6 +1111,8 @@ SUBJECT MODIFIERS
|
||||||
match_limit=<n> set a match limit
|
match_limit=<n> set a match limit
|
||||||
memory show heap memory usage
|
memory show heap memory usage
|
||||||
null_context match with a NULL context
|
null_context match with a NULL context
|
||||||
|
null_replacement substitute with NULL replacement
|
||||||
|
null_subject match with NULL subject
|
||||||
offset=<n> set starting offset
|
offset=<n> set starting offset
|
||||||
offset_limit=<n> set offset limit
|
offset_limit=<n> set offset limit
|
||||||
ovector=<n> set size of output vector
|
ovector=<n> set size of output vector
|
||||||
|
@ -1499,7 +1501,7 @@ SUBJECT MODIFIERS
|
||||||
When testing pcre2_substitute(), this modifier also has the effect of
|
When testing pcre2_substitute(), this modifier also has the effect of
|
||||||
passing the replacement string as zero-terminated.
|
passing the replacement string as zero-terminated.
|
||||||
|
|
||||||
Passing a NULL context
|
Passing a NULL context, subject, or replacement
|
||||||
|
|
||||||
Normally, pcre2test passes a context block to pcre2_match(),
|
Normally, pcre2test passes a context block to pcre2_match(),
|
||||||
pcre2_dfa_match(), pcre2_jit_match() or pcre2_substitute(). If the
|
pcre2_dfa_match(), pcre2_jit_match() or pcre2_substitute(). If the
|
||||||
|
@ -1508,6 +1510,10 @@ SUBJECT MODIFIERS
|
||||||
in this case (they use default values). This modifier cannot be used
|
in this case (they use default values). This modifier cannot be used
|
||||||
with the find_limits or substitute_callout modifiers.
|
with the find_limits or substitute_callout modifiers.
|
||||||
|
|
||||||
|
Similarly, for testing purposes, if the null_subject or null_replace-
|
||||||
|
ment modifier is set, the subject or replacement string pointers are
|
||||||
|
passed as NULL, respectively, to the relevant functions.
|
||||||
|
|
||||||
|
|
||||||
THE ALTERNATIVE MATCHING FUNCTION
|
THE ALTERNATIVE MATCHING FUNCTION
|
||||||
|
|
||||||
|
@ -1933,5 +1939,5 @@ AUTHOR
|
||||||
|
|
||||||
REVISION
|
REVISION
|
||||||
|
|
||||||
Last updated: 30 August 2021
|
Last updated: 28 November 2021
|
||||||
Copyright (c) 1997-2021 University of Cambridge.
|
Copyright (c) 1997-2021 University of Cambridge.
|
||||||
|
|
|
@ -516,6 +516,8 @@ so many of them that they are split into two fields. */
|
||||||
#define CTL2_CALLOUT_NO_WHERE 0x00000200u
|
#define CTL2_CALLOUT_NO_WHERE 0x00000200u
|
||||||
#define CTL2_CALLOUT_EXTRA 0x00000400u
|
#define CTL2_CALLOUT_EXTRA 0x00000400u
|
||||||
#define CTL2_ALLVECTOR 0x00000800u
|
#define CTL2_ALLVECTOR 0x00000800u
|
||||||
|
#define CTL2_NULL_SUBJECT 0x00001000u
|
||||||
|
#define CTL2_NULL_REPLACEMENT 0x00002000u
|
||||||
|
|
||||||
#define CTL2_NL_SET 0x40000000u /* Informational */
|
#define CTL2_NL_SET 0x40000000u /* Informational */
|
||||||
#define CTL2_BSR_SET 0x80000000u /* Informational */
|
#define CTL2_BSR_SET 0x80000000u /* Informational */
|
||||||
|
@ -706,6 +708,8 @@ static modstruct modlist[] = {
|
||||||
{ "notempty_atstart", MOD_DAT, MOD_OPT, PCRE2_NOTEMPTY_ATSTART, DO(options) },
|
{ "notempty_atstart", MOD_DAT, MOD_OPT, PCRE2_NOTEMPTY_ATSTART, DO(options) },
|
||||||
{ "noteol", MOD_DAT, MOD_OPT, PCRE2_NOTEOL, DO(options) },
|
{ "noteol", MOD_DAT, MOD_OPT, PCRE2_NOTEOL, DO(options) },
|
||||||
{ "null_context", MOD_PD, MOD_CTL, CTL_NULLCONTEXT, PO(control) },
|
{ "null_context", MOD_PD, MOD_CTL, CTL_NULLCONTEXT, PO(control) },
|
||||||
|
{ "null_replacement", MOD_DAT, MOD_CTL, CTL2_NULL_REPLACEMENT, DO(control2) },
|
||||||
|
{ "null_subject", MOD_DAT, MOD_CTL, CTL2_NULL_SUBJECT, DO(control2) },
|
||||||
{ "offset", MOD_DAT, MOD_INT, 0, DO(offset) },
|
{ "offset", MOD_DAT, MOD_INT, 0, DO(offset) },
|
||||||
{ "offset_limit", MOD_CTM, MOD_SIZ, 0, MO(offset_limit)},
|
{ "offset_limit", MOD_CTM, MOD_SIZ, 0, MO(offset_limit)},
|
||||||
{ "ovector", MOD_DAT, MOD_INT, 0, DO(oveccount) },
|
{ "ovector", MOD_DAT, MOD_INT, 0, DO(oveccount) },
|
||||||
|
@ -7064,9 +7068,14 @@ pp = memmove(dbuffer + dbuffer_size - len - c, dbuffer, len + c);
|
||||||
VALGRIND_MAKE_MEM_NOACCESS(dbuffer, dbuffer_size - (len + c));
|
VALGRIND_MAKE_MEM_NOACCESS(dbuffer, dbuffer_size - (len + c));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Now pp points to the subject string. POSIX matching is only possible in
|
/* Now pp points to the subject string, but if null_subject was specified, set
|
||||||
8-bit mode, and it does not support timing or other fancy features. Some were
|
it to NULL to test PCRE2's behaviour. */
|
||||||
checked at compile time, but we need to check the match-time settings here. */
|
|
||||||
|
if ((dat_datctl.control2 & CTL2_NULL_SUBJECT) != 0) pp = NULL;
|
||||||
|
|
||||||
|
/* POSIX matching is only possible in 8-bit mode, and it does not support
|
||||||
|
timing or other fancy features. Some were checked at compile time, but we need
|
||||||
|
to check the match-time settings here. */
|
||||||
|
|
||||||
#ifdef SUPPORT_PCRE2_8
|
#ifdef SUPPORT_PCRE2_8
|
||||||
if ((pat_patctl.control & CTL_POSIX) != 0)
|
if ((pat_patctl.control & CTL_POSIX) != 0)
|
||||||
|
@ -7293,6 +7302,7 @@ if (dat_datctl.replacement[0] != 0)
|
||||||
uint8_t *pr;
|
uint8_t *pr;
|
||||||
uint8_t rbuffer[REPLACE_BUFFSIZE];
|
uint8_t rbuffer[REPLACE_BUFFSIZE];
|
||||||
uint8_t nbuffer[REPLACE_BUFFSIZE];
|
uint8_t nbuffer[REPLACE_BUFFSIZE];
|
||||||
|
uint8_t *rbptr;
|
||||||
uint32_t xoptions;
|
uint32_t xoptions;
|
||||||
uint32_t emoption; /* External match option */
|
uint32_t emoption; /* External match option */
|
||||||
PCRE2_SIZE j, rlen, nsize, erroroffset;
|
PCRE2_SIZE j, rlen, nsize, erroroffset;
|
||||||
|
@ -7443,9 +7453,14 @@ if (dat_datctl.replacement[0] != 0)
|
||||||
PCRE2_SET_SUBSTITUTE_CALLOUT(dat_context, NULL, NULL); /* No callout */
|
PCRE2_SET_SUBSTITUTE_CALLOUT(dat_context, NULL, NULL); /* No callout */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* There is a special option to set the replacement to NULL in order to test
|
||||||
|
that case. */
|
||||||
|
|
||||||
|
rbptr = ((dat_datctl.control2 & CTL2_NULL_REPLACEMENT) == 0)? rbuffer : NULL;
|
||||||
|
|
||||||
PCRE2_SUBSTITUTE(rc, compiled_code, pp, arg_ulen, dat_datctl.offset,
|
PCRE2_SUBSTITUTE(rc, compiled_code, pp, arg_ulen, dat_datctl.offset,
|
||||||
dat_datctl.options|xoptions, match_data, use_dat_context,
|
dat_datctl.options|xoptions, match_data, use_dat_context,
|
||||||
rbuffer, rlen, nbuffer, &nsize);
|
rbptr, rlen, nbuffer, &nsize);
|
||||||
|
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue