Remove the ability to change newlines and \R at match time.

This commit is contained in:
Philip.Hazel 2014-10-01 17:02:33 +00:00
parent a0410efc56
commit e036c5fba0
17 changed files with 288 additions and 508 deletions

View File

@ -1,4 +1,4 @@
.TH PCRE2API 3 "16 September 2014" "PCRE2 10.00" .TH PCRE2API 3 "01 October 2014" "PCRE2 10.00"
.SH NAME .SH NAME
PCRE2 - Perl-compatible regular expressions (revised API) PCRE2 - Perl-compatible regular expressions (revised API)
.sp .sp
@ -88,13 +88,13 @@ document for an overview of all the PCRE2 documentation.
.sp .sp
.B void pcre2_compile_context_free(pcre2_compile_context *\fIccontext\fP); .B void pcre2_compile_context_free(pcre2_compile_context *\fIccontext\fP);
.sp .sp
.B int pcre2_set_bsr_compile(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_bsr(pcre2_compile_context *\fIccontext\fP,
.B " uint32_t \fIvalue\fP);" .B " uint32_t \fIvalue\fP);"
.sp .sp
.B int pcre2_set_character_tables(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_character_tables(pcre2_compile_context *\fIccontext\fP,
.B " const unsigned char *\fItables\fP);" .B " const unsigned char *\fItables\fP);"
.sp .sp
.B int pcre2_set_newline_compile(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_newline(pcre2_compile_context *\fIccontext\fP,
.B " uint32_t \fIvalue\fP);" .B " uint32_t \fIvalue\fP);"
.sp .sp
.B int pcre2_set_parens_nest_limit(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_parens_nest_limit(pcre2_compile_context *\fIccontext\fP,
@ -117,9 +117,6 @@ document for an overview of all the PCRE2 documentation.
.sp .sp
.B void pcre2_match_context_free(pcre2_match_context *\fImcontext\fP); .B void pcre2_match_context_free(pcre2_match_context *\fImcontext\fP);
.sp .sp
.B int pcre2_set_bsr_match(pcre2_match_context *\fImcontext\fP,
.B " uint32_t \fIvalue\fP);"
.sp
.B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP, .B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP,
.B " int (*\fIcallout_function\fP)(pcre2_callout_block *)," .B " int (*\fIcallout_function\fP)(pcre2_callout_block *),"
.B " void *\fIcallout_data\fP);" .B " void *\fIcallout_data\fP);"
@ -127,9 +124,6 @@ document for an overview of all the PCRE2 documentation.
.B int pcre2_set_match_limit(pcre2_match_context *\fImcontext\fP, .B int pcre2_set_match_limit(pcre2_match_context *\fImcontext\fP,
.B " uint32_t \fIvalue\fP);" .B " uint32_t \fIvalue\fP);"
.sp .sp
.B int pcre2_set_newline_match(pcre2_match_context *\fImcontext\fP,
.B " uint32_t \fIvalue\fP);"
.sp
.B int pcre2_set_recursion_limit(pcre2_match_context *\fImcontext\fP, .B int pcre2_set_recursion_limit(pcre2_match_context *\fImcontext\fP,
.B " uint32_t \fIvalue\fP);" .B " uint32_t \fIvalue\fP);"
.sp .sp
@ -549,7 +543,7 @@ be changed by calling the following functions, which return 0 on success, or
PCRE2_ERROR_BADDATA if invalid data is detected. PCRE2_ERROR_BADDATA if invalid data is detected.
.sp .sp
.nf .nf
.B int pcre2_set_bsr_compile(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_bsr(pcre2_compile_context *\fIccontext\fP,
.B " uint32_t \fIvalue\fP);" .B " uint32_t \fIvalue\fP);"
.fi .fi
.sp .sp
@ -558,8 +552,7 @@ or CRLF, or PCRE2_BSR_UNICODE, to specify that \eR matches any Unicode line
ending sequence. The value of this parameter does not affect what is compiled; ending sequence. The value of this parameter does not affect what is compiled;
it is just saved with the compiled pattern. The value is used by the JIT it is just saved with the compiled pattern. The value is used by the JIT
compiler and by the two interpreted matching functions, \fIpcre2_match()\fP and compiler and by the two interpreted matching functions, \fIpcre2_match()\fP and
\fIpcre2_dfa_match()\fP. You can change the value when calling these functions, \fIpcre2_dfa_match()\fP.
but doing so disables the use of JIT.
.sp .sp
.nf .nf
.B int pcre2_set_character_tables(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_character_tables(pcre2_compile_context *\fIccontext\fP,
@ -571,7 +564,7 @@ argument is a general context. This function builds a set of character tables
in the current locale. in the current locale.
.sp .sp
.nf .nf
.B int pcre2_set_newline_compile(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_newline(pcre2_compile_context *\fIccontext\fP,
.B " uint32_t \fIvalue\fP);" .B " uint32_t \fIvalue\fP);"
.fi .fi
.sp .sp
@ -585,8 +578,7 @@ When a pattern is compiled with the PCRE2_EXTENDED option, the value of this
parameter affects the recognition of white space and the end of internal parameter affects the recognition of white space and the end of internal
comments starting with #. The value is saved with the compiled pattern for comments starting with #. The value is saved with the compiled pattern for
subsequent use by the JIT compiler and by the two interpreted matching subsequent use by the JIT compiler and by the two interpreted matching
functions, \fIpcre2_match()\fP and \fIpcre2_dfa_match()\fP. You can change the functions, \fIpcre2_match()\fP and \fIpcre2_dfa_match()\fP.
value when calling these functions, but doing so disables the use of JIT.
.sp .sp
.nf .nf
.B int pcre2_set_parens_nest_limit(pcre2_compile_context *\fIccontext\fP, .B int pcre2_set_parens_nest_limit(pcre2_compile_context *\fIccontext\fP,
@ -647,16 +639,6 @@ be changed by calling the following functions, which return 0 on success, or
PCRE2_ERROR_BADDATA if invalid data is detected. PCRE2_ERROR_BADDATA if invalid data is detected.
.sp .sp
.nf .nf
.B int pcre2_set_bsr_match(pcre2_match_context *\fImcontext\fP,
.B " uint32_t \fIvalue\fP);"
.fi
.sp
The value must be PCRE2_BSR_ANYCRLF, to specify that \eR matches only CR, LF,
or CRLF, or PCRE2_BSR_UNICODE, to specify that \eR matches any Unicode line
ending sequence. If you want to make use of JIT matching, you should not use
this function, but instead set the value in a compile context.
.sp
.nf
.B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP, .B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP,
.B " int (*\fIcallout_function\fP)(pcre2_callout_block *)," .B " int (*\fIcallout_function\fP)(pcre2_callout_block *),"
.B " void *\fIcallout_data\fP);" .B " void *\fIcallout_data\fP);"
@ -736,19 +718,6 @@ less than the limit set by the caller of \fBpcre2_match()\fP or, if no such
limit is set, less than the default. limit is set, less than the default.
.sp .sp
.nf .nf
.B int pcre2_set_newline_match(pcre2_match_context *\fImcontext\fP,
.B " uint32_t \fIvalue\fP);"
.fi
.sp
This specifies which characters or character sequences are to be recognized as
newlines. The value must be one of PCRE2_NEWLINE_CR (carriage return only),
PCRE2_NEWLINE_LF (linefeed only), PCRE2_NEWLINE_CRLF (the two-character
sequence CR followed by LF), PCRE2_NEWLINE_ANYCRLF (any of the above), or
PCRE2_NEWLINE_ANY (any Unicode newline sequence). If you want to make use of
JIT matching, you should not use this function, but instead set the value in a
compile context.
.sp
.nf
.B int pcre2_set_recursion_memory_management( .B int pcre2_set_recursion_memory_management(
.B " pcre2_match_context *\fImcontext\fP," .B " pcre2_match_context *\fImcontext\fP,"
.B " void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *)," .B " void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *),"
@ -2683,6 +2652,6 @@ Cambridge CB2 3QH, England.
.rs .rs
.sp .sp
.nf .nf
Last updated: 16 September 2014 Last updated: 01 October 2014
Copyright (c) 1997-2014 University of Cambridge. Copyright (c) 1997-2014 University of Cambridge.
.fi .fi

View File

@ -458,9 +458,6 @@ is built, with the default default being Unicode.
The \fBnewline\fP modifier specifies which characters are to be interpreted as The \fBnewline\fP modifier specifies which characters are to be interpreted as
newlines, both in the pattern and (by default) in subject lines. The type must newlines, both in the pattern and (by default) in subject lines. The type must
be one of CR, LF, CRLF, ANYCRLF, or ANY. be one of CR, LF, CRLF, ANYCRLF, or ANY.
.P
Both the \eR and newline settings can be changed at match time, but if this is
done, JIT matching is disabled.
. .
. .
.SS "Information about a pattern" .SS "Information about a pattern"
@ -693,7 +690,6 @@ pattern.
allcaptures show all captures allcaptures show all captures
allusedtext show all consulted text allusedtext show all consulted text
altglobal alternative global matching altglobal alternative global matching
bsr=[anycrlf|unicode] specify \eR handling
callout_capture show captures at callout time callout_capture show captures at callout time
callout_data=<n> set a value to pass via callouts callout_data=<n> set a value to pass via callouts
callout_fail=<n>[:<m>] control callout failure callout_fail=<n>[:<m>] control callout failure
@ -709,7 +705,6 @@ pattern.
mark show mark values mark show mark values
match_limit=>n> set a match limit match_limit=>n> set a match limit
memory show memory usage memory show memory usage
newline=<type> set newline type
offset=<n> set starting offset offset=<n> set starting offset
ovector=<n> set size of output vector ovector=<n> set size of output vector
recursion_limit=<n> set a recursion limit recursion_limit=<n> set a recursion limit
@ -718,14 +713,6 @@ The effects of these modifiers are described in the following sections.
FIXME: Give more examples. FIXME: Give more examples.
. .
. .
.SS "Newline and \eR handling"
.rs
.sp
These modifiers set the newline and \eR processing conventions for the subject
line, overriding any values that were set at compile time (as described above).
JIT matching is disabled if these settings are changed at match time.
.
.
.SS "Showing more text" .SS "Showing more text"
.rs .rs
.sp .sp

View File

@ -140,9 +140,9 @@ functions, so take care not to define synonyms by mistake. */
#define PCRE2_DFA_RESTART 0x00000040u #define PCRE2_DFA_RESTART 0x00000040u
#define PCRE2_DFA_SHORTEST 0x00000080u #define PCRE2_DFA_SHORTEST 0x00000080u
/* Newline and \R settings, for use in the compile and match contexts. The /* Newline and \R settings, for use in compile contexts. The newline values
newline values must be kept in step with values set in config.h and both sets must be kept in step with values set in config.h and both sets must all be
must all be greater than zero. */ greater than zero. */
#define PCRE2_NEWLINE_CR 1 #define PCRE2_NEWLINE_CR 1
#define PCRE2_NEWLINE_LF 2 #define PCRE2_NEWLINE_LF 2
@ -356,12 +356,10 @@ PCRE2_EXP_DECL \
PCRE2_EXP_DECL \ PCRE2_EXP_DECL \
pcre2_compile_context *pcre2_compile_context_create(pcre2_general_context *);\ pcre2_compile_context *pcre2_compile_context_create(pcre2_general_context *);\
PCRE2_EXP_DECL void pcre2_compile_context_free(pcre2_compile_context *); \ PCRE2_EXP_DECL void pcre2_compile_context_free(pcre2_compile_context *); \
PCRE2_EXP_DECL int pcre2_set_bsr_compile(pcre2_compile_context *, \ PCRE2_EXP_DECL int pcre2_set_bsr(pcre2_compile_context *, uint32_t); \
uint32_t); \
PCRE2_EXP_DECL int pcre2_set_character_tables(pcre2_compile_context *, \ PCRE2_EXP_DECL int pcre2_set_character_tables(pcre2_compile_context *, \
const unsigned char *); \ const unsigned char *); \
PCRE2_EXP_DECL int pcre2_set_newline_compile(pcre2_compile_context *, \ PCRE2_EXP_DECL int pcre2_set_newline(pcre2_compile_context *, uint32_t); \
uint32_t); \
PCRE2_EXP_DECL int pcre2_set_parens_nest_limit(pcre2_compile_context *, \ PCRE2_EXP_DECL int pcre2_set_parens_nest_limit(pcre2_compile_context *, \
uint32_t); \ uint32_t); \
PCRE2_EXP_DECL int pcre2_set_compile_recursion_guard(\ PCRE2_EXP_DECL int pcre2_set_compile_recursion_guard(\
@ -373,14 +371,10 @@ PCRE2_EXP_DECL \
PCRE2_EXP_DECL \ PCRE2_EXP_DECL \
pcre2_match_context *pcre2_match_context_create(pcre2_general_context *); \ pcre2_match_context *pcre2_match_context_create(pcre2_general_context *); \
PCRE2_EXP_DECL void pcre2_match_context_free(pcre2_match_context *); \ PCRE2_EXP_DECL void pcre2_match_context_free(pcre2_match_context *); \
PCRE2_EXP_DECL int pcre2_set_bsr_match(pcre2_match_context *, \
uint32_t); \
PCRE2_EXP_DECL int pcre2_set_callout(pcre2_match_context *, \ PCRE2_EXP_DECL int pcre2_set_callout(pcre2_match_context *, \
int (*)(pcre2_callout_block *), void *); \ int (*)(pcre2_callout_block *), void *); \
PCRE2_EXP_DECL int pcre2_set_match_limit(pcre2_match_context *, \ PCRE2_EXP_DECL int pcre2_set_match_limit(pcre2_match_context *, \
uint32_t); \ uint32_t); \
PCRE2_EXP_DECL int pcre2_set_newline_match(pcre2_match_context *, \
uint32_t); \
PCRE2_EXP_DECL int pcre2_set_recursion_limit(pcre2_match_context *, \ PCRE2_EXP_DECL int pcre2_set_recursion_limit(pcre2_match_context *, \
uint32_t); \ uint32_t); \
PCRE2_EXP_DECL int pcre2_set_recursion_memory_management( \ PCRE2_EXP_DECL int pcre2_set_recursion_memory_management( \
@ -552,14 +546,12 @@ pcre2_compile are called by application code. */
#define pcre2_match_data_create_from_pattern PCRE2_SUFFIX(pcre2_match_data_create_from_pattern_) #define pcre2_match_data_create_from_pattern PCRE2_SUFFIX(pcre2_match_data_create_from_pattern_)
#define pcre2_match_data_free PCRE2_SUFFIX(pcre2_match_data_free_) #define pcre2_match_data_free PCRE2_SUFFIX(pcre2_match_data_free_)
#define pcre2_pattern_info PCRE2_SUFFIX(pcre2_pattern_info_) #define pcre2_pattern_info PCRE2_SUFFIX(pcre2_pattern_info_)
#define pcre2_set_bsr_compile PCRE2_SUFFIX(pcre2_set_bsr_compile_) #define pcre2_set_bsr PCRE2_SUFFIX(pcre2_set_bsr_)
#define pcre2_set_bsr_match PCRE2_SUFFIX(pcre2_set_bsr_match_)
#define pcre2_set_callout PCRE2_SUFFIX(pcre2_set_callout_) #define pcre2_set_callout PCRE2_SUFFIX(pcre2_set_callout_)
#define pcre2_set_character_tables PCRE2_SUFFIX(pcre2_set_character_tables_) #define pcre2_set_character_tables PCRE2_SUFFIX(pcre2_set_character_tables_)
#define pcre2_set_compile_recursion_guard PCRE2_SUFFIX(pcre2_set_compile_recursion_guard_) #define pcre2_set_compile_recursion_guard PCRE2_SUFFIX(pcre2_set_compile_recursion_guard_)
#define pcre2_set_match_limit PCRE2_SUFFIX(pcre2_set_match_limit_) #define pcre2_set_match_limit PCRE2_SUFFIX(pcre2_set_match_limit_)
#define pcre2_set_newline_compile PCRE2_SUFFIX(pcre2_set_newline_compile_) #define pcre2_set_newline PCRE2_SUFFIX(pcre2_set_newline_)
#define pcre2_set_newline_match PCRE2_SUFFIX(pcre2_set_newline_match_)
#define pcre2_set_parens_nest_limit PCRE2_SUFFIX(pcre2_set_parens_nest_limit_) #define pcre2_set_parens_nest_limit PCRE2_SUFFIX(pcre2_set_parens_nest_limit_)
#define pcre2_set_recursion_limit PCRE2_SUFFIX(pcre2_set_recursion_limit_) #define pcre2_set_recursion_limit PCRE2_SUFFIX(pcre2_set_recursion_limit_)
#define pcre2_set_recursion_memory_management PCRE2_SUFFIX(pcre2_set_recursion_memory_management_) #define pcre2_set_recursion_memory_management PCRE2_SUFFIX(pcre2_set_recursion_memory_management_)

View File

@ -169,8 +169,6 @@ mcontext->stack_memctl = mcontext->memctl;
#endif #endif
mcontext->callout = NULL; mcontext->callout = NULL;
mcontext->callout_data = NULL; mcontext->callout_data = NULL;
mcontext->newline_convention = 0;
mcontext->bsr_convention = 0;
mcontext->match_limit = MATCH_LIMIT; mcontext->match_limit = MATCH_LIMIT;
mcontext->recursion_limit = MATCH_LIMIT_RECURSION; mcontext->recursion_limit = MATCH_LIMIT_RECURSION;
} }
@ -279,7 +277,7 @@ return 0;
} }
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_bsr_compile(pcre2_compile_context *ccontext, uint32_t value) pcre2_set_bsr(pcre2_compile_context *ccontext, uint32_t value)
{ {
switch(value) switch(value)
{ {
@ -294,7 +292,7 @@ switch(value)
} }
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_newline_compile(pcre2_compile_context *ccontext, uint32_t newline) pcre2_set_newline(pcre2_compile_context *ccontext, uint32_t newline)
{ {
switch(newline) switch(newline)
{ {
@ -329,39 +327,6 @@ return 0;
/* ------------ Match contexts ------------ */ /* ------------ Match contexts ------------ */
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_bsr_match(pcre2_match_context *mcontext, uint32_t value)
{
switch(value)
{
case PCRE2_BSR_ANYCRLF:
case PCRE2_BSR_UNICODE:
mcontext->bsr_convention = value;
return 0;
default:
return PCRE2_ERROR_BADDATA;
}
}
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_newline_match(pcre2_match_context *mcontext, uint32_t newline)
{
switch(newline)
{
case PCRE2_NEWLINE_CR:
case PCRE2_NEWLINE_LF:
case PCRE2_NEWLINE_CRLF:
case PCRE2_NEWLINE_ANY:
case PCRE2_NEWLINE_ANYCRLF:
mcontext->newline_convention = newline;
return 0;
default:
return PCRE2_ERROR_BADDATA;
}
}
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
pcre2_set_callout(pcre2_match_context *mcontext, pcre2_set_callout(pcre2_match_context *mcontext,
int (*callout)(pcre2_callout_block *), void *callout_data) int (*callout)(pcre2_callout_block *), void *callout_data)

View File

@ -3069,7 +3069,6 @@ pcre2_dfa_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length,
{ {
const pcre2_real_code *re = (const pcre2_real_code *)code; const pcre2_real_code *re = (const pcre2_real_code *)code;
pcre2_match_context default_context; /* For use if no context given */ pcre2_match_context default_context; /* For use if no context given */
int newline;
PCRE2_SPTR start_match; PCRE2_SPTR start_match;
PCRE2_SPTR end_subject; PCRE2_SPTR end_subject;
@ -3203,18 +3202,11 @@ mb->start_offset = start_offset;
mb->moptions = options; mb->moptions = options;
mb->poptions = re->overall_options; mb->poptions = re->overall_options;
/* The match context /R convention, if set, overrides. */ /* Process the \R and newline settings. */
mb->bsr_convention = (mcontext->bsr_convention != 0)?
mcontext->bsr_convention : re->bsr_convention;
/* Process the newline setting. */
newline = (mcontext->newline_convention == 0)?
re->newline_convention : mcontext->newline_convention;
mb->bsr_convention = re->bsr_convention;
mb->nltype = NLTYPE_FIXED; mb->nltype = NLTYPE_FIXED;
switch(newline) switch(re->newline_convention)
{ {
case PCRE2_NEWLINE_CR: case PCRE2_NEWLINE_CR:
mb->nllen = 1; mb->nllen = 1;

View File

@ -570,8 +570,6 @@ typedef struct pcre2_real_match_context {
#endif #endif
int (*callout)(pcre2_callout_block *); int (*callout)(pcre2_callout_block *);
void *callout_data; void *callout_data;
uint16_t bsr_convention;
uint16_t newline_convention;
uint32_t match_limit; uint32_t match_limit;
uint32_t recursion_limit; uint32_t recursion_limit;
} pcre2_real_match_context; } pcre2_real_match_context;

View File

@ -6346,7 +6346,6 @@ pcre2_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length,
pcre2_match_context *mcontext) pcre2_match_context *mcontext)
{ {
int rc; int rc;
int newline;
int ocount; int ocount;
const uint8_t *start_bits = NULL; const uint8_t *start_bits = NULL;
@ -6482,8 +6481,7 @@ an unsupported option is set or if JIT returns BADOPTION (which means that the
selected normal or partial matching mode was not compiled). */ selected normal or partial matching mode was not compiled). */
#ifdef SUPPORT_JIT #ifdef SUPPORT_JIT
if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0 && if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0)
mcontext->bsr_convention == 0 && mcontext->newline_convention == 0)
{ {
rc = pcre2_jit_match(code, subject, length, start_offset, options, rc = pcre2_jit_match(code, subject, length, start_offset, options,
match_data, mcontext, NULL); match_data, mcontext, NULL);
@ -6553,18 +6551,11 @@ mb->lcc = re->tables + lcc_offset;
mb->fcc = re->tables + fcc_offset; mb->fcc = re->tables + fcc_offset;
mb->ctypes = re->tables + ctypes_offset; mb->ctypes = re->tables + ctypes_offset;
/* The match context /R convention, if set, overrides. */ /* Process the \R and newline settings. */
mb->bsr_convention = (mcontext->bsr_convention != 0)?
mcontext->bsr_convention : re->bsr_convention;
/* Process the newline setting. */
newline = (mcontext->newline_convention == 0)?
re->newline_convention : mcontext->newline_convention;
mb->bsr_convention = re->bsr_convention;
mb->nltype = NLTYPE_FIXED; mb->nltype = NLTYPE_FIXED;
switch(newline) switch(re->newline_convention)
{ {
case PCRE2_NEWLINE_CR: case PCRE2_NEWLINE_CR:
mb->nllen = 1; mb->nllen = 1;

View File

@ -3013,7 +3013,7 @@ if (newline_arg != NULL)
if (strcmpic(newline_arg, newlines[endlinetype]) == 0) break; if (strcmpic(newline_arg, newlines[endlinetype]) == 0) break;
} }
if (endlinetype < (int)(sizeof(newlines)/sizeof(char *))) if (endlinetype < (int)(sizeof(newlines)/sizeof(char *)))
pcre2_set_newline_compile(compile_context, endlinetype); pcre2_set_newline(compile_context, endlinetype);
else else
{ {
fprintf(stderr, "pcre2grep: Invalid newline specifier \"%s\"\n", fprintf(stderr, "pcre2grep: Invalid newline specifier \"%s\"\n",

View File

@ -296,8 +296,7 @@ static const char *newlines[] = {
/* Modifier types and applicability */ /* Modifier types and applicability */
enum { MOD_CTB, /* Applies to a compile or a match context */ enum { MOD_CTC, /* Applies to a compile context */
MOD_CTC, /* Applies to a compile context */
MOD_CTM, /* Applies to a match context */ MOD_CTM, /* Applies to a match context */
MOD_PAT, /* Applies to a pattern */ MOD_PAT, /* Applies to a pattern */
MOD_PATP, /* Ditto, OK for Perl test */ MOD_PATP, /* Ditto, OK for Perl test */
@ -424,7 +423,7 @@ static modstruct modlist[] = {
{ "anchored", MOD_PD, MOD_OPT, PCRE2_ANCHORED, PD(options) }, { "anchored", MOD_PD, MOD_OPT, PCRE2_ANCHORED, PD(options) },
{ "auto_callout", MOD_PAT, MOD_OPT, PCRE2_AUTO_CALLOUT, PO(options) }, { "auto_callout", MOD_PAT, MOD_OPT, PCRE2_AUTO_CALLOUT, PO(options) },
{ "bincode", MOD_PAT, MOD_CTL, CTL_BINCODE, PO(control) }, { "bincode", MOD_PAT, MOD_CTL, CTL_BINCODE, PO(control) },
{ "bsr", MOD_CTB, MOD_BSR, MO(bsr_convention), CO(bsr_convention) }, { "bsr", MOD_CTC, MOD_BSR, 0, CO(bsr_convention) },
{ "callout_capture", MOD_DAT, MOD_CTL, CTL_CALLOUT_CAPTURE, DO(control) }, { "callout_capture", MOD_DAT, MOD_CTL, CTL_CALLOUT_CAPTURE, DO(control) },
{ "callout_data", MOD_DAT, MOD_INS, 0, DO(callout_data) }, { "callout_data", MOD_DAT, MOD_INS, 0, DO(callout_data) },
{ "callout_fail", MOD_DAT, MOD_IN2, 0, DO(cfail) }, { "callout_fail", MOD_DAT, MOD_IN2, 0, DO(cfail) },
@ -458,7 +457,7 @@ static modstruct modlist[] = {
{ "multiline", MOD_PATP, MOD_OPT, PCRE2_MULTILINE, PO(options) }, { "multiline", MOD_PATP, MOD_OPT, PCRE2_MULTILINE, PO(options) },
{ "never_ucp", MOD_PAT, MOD_OPT, PCRE2_NEVER_UCP, PO(options) }, { "never_ucp", MOD_PAT, MOD_OPT, PCRE2_NEVER_UCP, PO(options) },
{ "never_utf", MOD_PAT, MOD_OPT, PCRE2_NEVER_UTF, PO(options) }, { "never_utf", MOD_PAT, MOD_OPT, PCRE2_NEVER_UTF, PO(options) },
{ "newline", MOD_CTB, MOD_NL, MO(newline_convention), CO(newline_convention) }, { "newline", MOD_CTC, MOD_NL, 0, CO(newline_convention) },
{ "no_auto_capture", MOD_PAT, MOD_OPT, PCRE2_NO_AUTO_CAPTURE, PO(options) }, { "no_auto_capture", MOD_PAT, MOD_OPT, PCRE2_NO_AUTO_CAPTURE, PO(options) },
{ "no_auto_possess", MOD_PATP, MOD_OPT, PCRE2_NO_AUTO_POSSESS, PO(options) }, { "no_auto_possess", MOD_PATP, MOD_OPT, PCRE2_NO_AUTO_POSSESS, PO(options) },
{ "no_start_optimize", MOD_PATP, MOD_OPT, PCRE2_NO_START_OPTIMIZE, PO(options) }, { "no_start_optimize", MOD_PATP, MOD_OPT, PCRE2_NO_START_OPTIMIZE, PO(options) },
@ -2529,16 +2528,10 @@ if (restrict_for_perl_test) switch(m->which)
switch (m->which) switch (m->which)
{ {
case MOD_CTB: /* Compile or match context modifier */
case MOD_CTC: /* Compile context modifier */ case MOD_CTC: /* Compile context modifier */
if (ctx == CTX_DEFPAT) field = PTR(default_pat_context); if (ctx == CTX_DEFPAT) field = PTR(default_pat_context);
else if (ctx == CTX_PAT) field = PTR(pat_context); else if (ctx == CTX_PAT) field = PTR(pat_context);
if (field != NULL || m->which == MOD_CTC) break; break;
/* Fall through for something that can also be in a match context. In this
case the offset is taken from the other field. */
offset = (PCRE2_SIZE)(m->value);
case MOD_CTM: /* Match context modifier */ case MOD_CTM: /* Match context modifier */
if (ctx == CTX_DEFDAT) field = PTR(default_dat_context); if (ctx == CTX_DEFDAT) field = PTR(default_dat_context);

98
testdata/testinput2 vendored
View File

@ -1540,67 +1540,44 @@ a random value. /Ix
\x0b,\x0b \x0b,\x0b
\x0c,\x0d \x0c,\x0d
/^abc/Im /^abc/Im,newline=lf
xyz\nabc xyz\nabc
xyz\nabc>\=newline=lf xyz\r\nabc
xyz\r\nabc>\=newline=lf
xyz\rabc>\=newline=cr
xyz\r\nabclf>\=newline=crlf
** Failers
xyz\nabc>\=newline=cr
xyz\r\nabc>\=newline=cr
xyz\nabclf>\=newline=crlf
xyz\rabclf>\=newline=crlf
xyz\rabc>\=newline=lf
/abc$/Im,newline=lf
xyzabc
xyzabc\n
xyzabc\npqr
xyzabc\r>\=newline=cr
xyzabc\rpqr>\=newline=cr
xyzabc\r\nlf>\=newline=crlf
xyzabc\r\npqrlf>\=newline=crlf
** Failers ** Failers
xyz\rabc
xyzabc\r xyzabc\r
xyzabc\rpqr xyzabc\rpqr
xyzabc\r\n xyzabc\r\n
xyzabc\r\npqr xyzabc\r\npqr
/^abc/Im,newline=cr
xyz\rabcdef
xyz\nabcdef>\=newline=lf
** Failers
xyz\nabcdef
/^abc/Im,newline=lf
xyz\nabcdef
xyz\rabcdef>\=newline=cr
** Failers
xyz\rabcdef
/^abc/Im,newline=crlf /^abc/Im,newline=crlf
xyz\r\nabcdef xyz\r\nabclf>
xyz\rabcdef>\=newline=cr
** Failers ** Failers
xyz\rabcdef xyz\nabclf
xyz\rabclf
/^abc/Im,newline=cr
xyz\rabc
** Failers
xyz\nabc
xyz\r\nabc
/^abc/Im,newline=bad /^abc/Im,newline=bad
/abc/I
xyz\rabc\=newline=bad
abc
/.*/I,newline=lf /.*/I,newline=lf
abc\ndef abc\ndef
abc\rdef abc\rdef
abc\r\ndef abc\r\ndef
abc\ndef\=newline=cr
abc\rdef\=newline=cr /.*/I,newline=cr
abc\r\ndef\=newline=cr abc\ndef
abc\ndef\=newline=crlf abc\rdef
abc\rdef\=newline=crlf abc\r\ndef
abc\r\ndef\=newline=crlf
/.*/I,newline=crlf
abc\ndef
abc\rdef
abc\r\ndef
/\w+(.)(.)?def/Is /\w+(.)(.)?def/Is
abc\ndef abc\ndef
@ -1920,15 +1897,24 @@ a random value. /Ix
/^a.b/newline=lf /^a.b/newline=lf
a\rb a\rb
a\nb>\=newline=cr
a\x85b>\=newline=anycrlf
** Failers ** Failers
a\nb a\nb
a\nb\=newline=any
a\rb>\=newline=cr /^a.b/newline=cr
a\rb\=newline=any a\nb
a\x85b\=newline=any ** Failers
a\rb>\=newline=anycrlf a\rb
/^a.b/newline=anycrlf
a\x85b
** Failers
a\rb
/^a.b/newline=any
** Failers
a\nb
a\rb
a\x85b
/^abc./gmx,newline=any /^abc./gmx,newline=any
abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
@ -2281,9 +2267,6 @@ a random value. /Ix
a\r\nb a\r\nb
a\x85b a\x85b
a\x0bb a\x0bb
** Failers
a\x85b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/a\R?b/I,bsr=anycrlf /a\R?b/I,bsr=anycrlf
a\rb a\rb
@ -2299,9 +2282,6 @@ a random value. /Ix
a\r\nb a\r\nb
a\x85b a\x85b
a\x0bb a\x0bb
** Failers
a\x85b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/a\R{2,4}b/I,bsr=anycrlf /a\R{2,4}b/I,bsr=anycrlf
a\r\n\nb a\r\n\nb
@ -2319,8 +2299,6 @@ a random value. /Ix
a\x0b\x0bb a\x0b\x0bb
** Failers ** Failers
a\r\r\r\r\rb a\r\r\r\r\rb
a\x85\x85b\=bsr=anycrlf
a\x0b\x0bb\=bsr=anycrlf
/(*BSR_ANYCRLF)a\Rb/I /(*BSR_ANYCRLF)a\Rb/I
a\nb a\nb

5
testdata/testinput5 vendored
View File

@ -310,9 +310,6 @@
a\r\nb a\r\nb
a\x{85}b a\x{85}b
a\x0bb a\x0bb
** Failers
a\x{85}b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/a\R?b/I,bsr=anycrlf,utf /a\R?b/I,bsr=anycrlf,utf
a\rb a\rb
@ -329,8 +326,6 @@
a\x{85}b a\x{85}b
a\x0bb a\x0bb
** Failers ** Failers
a\x{85}b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/.*a.*=.b.*/utf,newline=any /.*a.*=.b.*/utf,newline=any
QQQ\x{2029}ABCaXYZ=!bPQR QQQ\x{2029}ABCaXYZ=!bPQR

112
testdata/testinput6 vendored
View File

@ -4003,61 +4003,47 @@
/Content-Type\x3A[^a]{6,}z/ /Content-Type\x3A[^a]{6,}z/
Content-Type:xxxyyyz Content-Type:xxxyyyz
/^abc/m /^abc/Im,newline=lf
xyz\nabc xyz\nabc
xyz\nabc\=newline=lf xyz\r\nabc
xyz\r\nabc\=newline=lf
xyz\rabc\=newline=cr
xyz\r\nabc\=newline=crlf
** Failers
xyz\nabc\=newline=cr
xyz\r\nabc\=newline=cr
xyz\nabc\=newline=crlf
xyz\rabc\=newline=crlf
xyz\rabc\=newline=lf
/abc$/m,newline=lf
xyzabc
xyzabc\n
xyzabc\npqr
xyzabc\r\=newline=cr
xyzabc\rpqr\=newline=cr
xyzabc\r\n\=newline=crlf
xyzabc\r\npqr\=newline=crlf
** Failers ** Failers
xyzabc\r xyz\rabc
xyzabc\rpqr xyzabc\r
xyzabc\r\n xyzabc\rpqr
xyzabc\r\npqr xyzabc\r\n
xyzabc\r\npqr
/^abc/Im,newline=crlf
xyz\r\nabclf>
** Failers
xyz\nabclf
xyz\rabclf
/^abc/m,newline=cr /^abc/Im,newline=cr
xyz\rabcdef xyz\rabc
xyz\nabcdef\=newline=lf ** Failers
** Failers xyz\nabc
xyz\nabcdef xyz\r\nabc
/^abc/m,newline=lf /.*/I,newline=lf
xyz\nabcdef abc\ndef
xyz\rabcdef\=newline=cr abc\rdef
** Failers abc\r\ndef
xyz\rabcdef
/.*/I,newline=cr
/^abc/m,newline=crlf abc\ndef
xyz\r\nabcdef abc\rdef
xyz\rabcdef\=newline=cr abc\r\ndef
** Failers
xyz\rabcdef /.*/I,newline=crlf
abc\ndef
/.*/newline=lf abc\rdef
abc\r\ndef
/\w+(.)(.)?def/Is
abc\ndef abc\ndef
abc\rdef abc\rdef
abc\r\ndef abc\r\ndef
abc\ndef\=newline=cr
abc\rdef\=newline=cr
abc\r\ndef\=newline=cr
abc\ndef\=newline=crlf
abc\rdef\=newline=crlf
abc\r\ndef\=newline=crlf
/\w+(.)(.)?def/s /\w+(.)(.)?def/s
abc\ndef abc\ndef
@ -4093,12 +4079,24 @@
/^a.b/newline=lf /^a.b/newline=lf
a\rb a\rb
a\nb\=newline=cr
** Failers ** Failers
a\nb a\nb
a\nb\=newline=any
a\rb\=newline=cr /^a.b/newline=cr
a\rb\=newline=any a\nb
** Failers
a\rb
/^a.b/newline=anycrlf
a\x85b
** Failers
a\rb
/^a.b/newline=any
** Failers
a\nb
a\rb
a\x85b
/^abc./gmx,newline=any /^abc./gmx,newline=any
abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
@ -4269,9 +4267,6 @@
a\r\nb a\r\nb
a\x85b a\x85b
a\x0bb a\x0bb
** Failers
a\x85b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/a\R?b/I,bsr=anycrlf /a\R?b/I,bsr=anycrlf
a\rb a\rb
@ -4287,9 +4282,6 @@
a\r\nb a\r\nb
a\x85b a\x85b
a\x0bb a\x0bb
** Failers
a\x85b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/a\R{2,4}b/I,bsr=anycrlf /a\R{2,4}b/I,bsr=anycrlf
a\r\n\nb a\r\n\nb
@ -4307,8 +4299,6 @@
a\x0b\0bb a\x0b\0bb
** Failers ** Failers
a\r\r\r\r\rb a\r\r\r\r\rb
a\x85\x85b\=bsr=anycrlf
a\x0b\0bb\=bsr=anycrlf
/a(?!)|\wbc/ /a(?!)|\wbc/
abc abc

6
testdata/testinput7 vendored
View File

@ -638,9 +638,6 @@
a\r\nb a\r\nb
a\x{85}b a\x{85}b
a\x0bb a\x0bb
** Failers
a\x{85}b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/a\R?b/I,bsr=anycrlf,utf /a\R?b/I,bsr=anycrlf,utf
a\rb a\rb
@ -656,9 +653,6 @@
a\r\nb a\r\nb
a\x{85}b a\x{85}b
a\x0bb a\x0bb
** Failers
a\x{85}b\=bsr=anycrlf
a\x0bb\=bsr=anycrlf
/X/newline=any,utf,firstline /X/newline=any,utf,firstline
A\x{1ec5}ABCXYZ A\x{1ec5}ABCXYZ

183
testdata/testoutput2 vendored
View File

@ -6024,57 +6024,20 @@ Subject length lower bound = 1
\x0c,\x0d \x0c,\x0d
0: \x0c,\x0d 0: \x0c,\x0d
/^abc/Im /^abc/Im,newline=lf
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: multiline Options: multiline
Forced newline is LF
First code unit at start or follows newline First code unit at start or follows newline
Last code unit = 'c' Last code unit = 'c'
Subject length lower bound = 3 Subject length lower bound = 3
xyz\nabc xyz\nabc
0: abc 0: abc
xyz\nabc>\=newline=lf xyz\r\nabc
0: abc
xyz\r\nabc>\=newline=lf
0: abc
xyz\rabc>\=newline=cr
0: abc
xyz\r\nabclf>\=newline=crlf
0: abc 0: abc
** Failers ** Failers
No match No match
xyz\nabc>\=newline=cr xyz\rabc
No match
xyz\r\nabc>\=newline=cr
No match
xyz\nabclf>\=newline=crlf
No match
xyz\rabclf>\=newline=crlf
No match
xyz\rabc>\=newline=lf
No match
/abc$/Im,newline=lf
Capturing subpattern count = 0
Options: multiline
Forced newline is LF
First code unit = 'a'
Last code unit = 'c'
Subject length lower bound = 3
xyzabc
0: abc
xyzabc\n
0: abc
xyzabc\npqr
0: abc
xyzabc\r>\=newline=cr
0: abc
xyzabc\rpqr>\=newline=cr
0: abc
xyzabc\r\nlf>\=newline=crlf
0: abc
xyzabc\r\npqrlf>\=newline=crlf
0: abc
** Failers
No match No match
xyzabc\r xyzabc\r
No match No match
@ -6085,38 +6048,6 @@ No match
xyzabc\r\npqr xyzabc\r\npqr
No match No match
/^abc/Im,newline=cr
Capturing subpattern count = 0
Options: multiline
Forced newline is CR
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
xyz\rabcdef
0: abc
xyz\nabcdef>\=newline=lf
0: abc
** Failers
No match
xyz\nabcdef
No match
/^abc/Im,newline=lf
Capturing subpattern count = 0
Options: multiline
Forced newline is LF
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
xyz\nabcdef
0: abc
xyz\rabcdef>\=newline=cr
0: abc
** Failers
No match
xyz\rabcdef
No match
/^abc/Im,newline=crlf /^abc/Im,newline=crlf
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: multiline Options: multiline
@ -6124,28 +6055,34 @@ Forced newline is CRLF
First code unit at start or follows newline First code unit at start or follows newline
Last code unit = 'c' Last code unit = 'c'
Subject length lower bound = 3 Subject length lower bound = 3
xyz\r\nabcdef xyz\r\nabclf>
0: abc
xyz\rabcdef>\=newline=cr
0: abc 0: abc
** Failers ** Failers
No match No match
xyz\rabcdef xyz\nabclf
No match
xyz\rabclf
No match
/^abc/Im,newline=cr
Capturing subpattern count = 0
Options: multiline
Forced newline is CR
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
xyz\rabc
0: abc
** Failers
No match
xyz\nabc
No match
xyz\r\nabc
No match No match
/^abc/Im,newline=bad /^abc/Im,newline=bad
** Invalid value in 'newline=bad' ** Invalid value in 'newline=bad'
/abc/I
Capturing subpattern count = 0
First code unit = 'a'
Last code unit = 'c'
Subject length lower bound = 3
xyz\rabc\=newline=bad
** Invalid value in 'newline=bad'
abc
0: abc
/.*/I,newline=lf /.*/I,newline=lf
Capturing subpattern count = 0 Capturing subpattern count = 0
May match empty string May match empty string
@ -6158,17 +6095,31 @@ Subject length lower bound = 0
0: abc\x0ddef 0: abc\x0ddef
abc\r\ndef abc\r\ndef
0: abc\x0d 0: abc\x0d
abc\ndef\=newline=cr
/.*/I,newline=cr
Capturing subpattern count = 0
May match empty string
Forced newline is CR
First code unit at start or follows newline
Subject length lower bound = 0
abc\ndef
0: abc\x0adef 0: abc\x0adef
abc\rdef\=newline=cr abc\rdef
0: abc 0: abc
abc\r\ndef\=newline=cr abc\r\ndef
0: abc 0: abc
abc\ndef\=newline=crlf
/.*/I,newline=crlf
Capturing subpattern count = 0
May match empty string
Forced newline is CRLF
First code unit at start or follows newline
Subject length lower bound = 0
abc\ndef
0: abc\x0adef 0: abc\x0adef
abc\rdef\=newline=crlf abc\rdef
0: abc\x0ddef 0: abc\x0ddef
abc\r\ndef\=newline=crlf abc\r\ndef
0: abc 0: abc
/\w+(.)(.)?def/Is /\w+(.)(.)?def/Is
@ -7457,23 +7408,35 @@ Matched, but too many substrings
/^a.b/newline=lf /^a.b/newline=lf
a\rb a\rb
0: a\x0db 0: a\x0db
a\nb>\=newline=cr
0: a\x0ab
a\x85b>\=newline=anycrlf
0: a\x85b
** Failers ** Failers
No match No match
a\nb a\nb
No match No match
a\nb\=newline=any
/^a.b/newline=cr
a\nb
0: a\x0ab
** Failers
No match No match
a\rb>\=newline=cr a\rb
No match No match
a\rb\=newline=any
/^a.b/newline=anycrlf
a\x85b
0: a\x85b
** Failers
No match No match
a\x85b\=newline=any a\rb
No match No match
a\rb>\=newline=anycrlf
/^a.b/newline=any
** Failers
No match
a\nb
No match
a\rb
No match
a\x85b
No match No match
/^abc./gmx,newline=any /^abc./gmx,newline=any
@ -8499,12 +8462,6 @@ Subject length lower bound = 3
0: a\x85b 0: a\x85b
a\x0bb a\x0bb
0: a\x0bb 0: a\x0bb
** Failers
No match
a\x85b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/a\R?b/I,bsr=anycrlf /a\R?b/I,bsr=anycrlf
Capturing subpattern count = 0 Capturing subpattern count = 0
@ -8541,12 +8498,6 @@ Subject length lower bound = 2
0: a\x85b 0: a\x85b
a\x0bb a\x0bb
0: a\x0bb 0: a\x0bb
** Failers
No match
a\x85b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/a\R{2,4}b/I,bsr=anycrlf /a\R{2,4}b/I,bsr=anycrlf
Capturing subpattern count = 0 Capturing subpattern count = 0
@ -8587,10 +8538,6 @@ Subject length lower bound = 4
No match No match
a\r\r\r\r\rb a\r\r\r\r\rb
No match No match
a\x85\x85b\=bsr=anycrlf
No match
a\x0b\x0bb\=bsr=anycrlf
No match
/(*BSR_ANYCRLF)a\Rb/I /(*BSR_ANYCRLF)a\Rb/I
Capturing subpattern count = 0 Capturing subpattern count = 0

10
testdata/testoutput5 vendored
View File

@ -779,12 +779,6 @@ Subject length lower bound = 3
0: a\x{85}b 0: a\x{85}b
a\x0bb a\x0bb
0: a\x{0b}b 0: a\x{0b}b
** Failers
No match
a\x{85}b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/a\R?b/I,bsr=anycrlf,utf /a\R?b/I,bsr=anycrlf,utf
Capturing subpattern count = 0 Capturing subpattern count = 0
@ -825,10 +819,6 @@ Subject length lower bound = 2
0: a\x{0b}b 0: a\x{0b}b
** Failers ** Failers
No match No match
a\x{85}b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/.*a.*=.b.*/utf,newline=any /.*a.*=.b.*/utf,newline=any
QQQ\x{2029}ABCaXYZ=!bPQR QQQ\x{2029}ABCaXYZ=!bPQR

199
testdata/testoutput6 vendored
View File

@ -6226,106 +6226,115 @@ Partial match: 123
Content-Type:xxxyyyz Content-Type:xxxyyyz
0: Content-Type:xxxyyyz 0: Content-Type:xxxyyyz
/^abc/m /^abc/Im,newline=lf
Capturing subpattern count = 0
Options: multiline
Forced newline is LF
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
xyz\nabc xyz\nabc
0: abc 0: abc
xyz\nabc\=newline=lf xyz\r\nabc
0: abc
xyz\r\nabc\=newline=lf
0: abc
xyz\rabc\=newline=cr
0: abc
xyz\r\nabc\=newline=crlf
0: abc
** Failers
No match
xyz\nabc\=newline=cr
No match
xyz\r\nabc\=newline=cr
No match
xyz\nabc\=newline=crlf
No match
xyz\rabc\=newline=crlf
No match
xyz\rabc\=newline=lf
No match
/abc$/m,newline=lf
xyzabc
0: abc
xyzabc\n
0: abc
xyzabc\npqr
0: abc
xyzabc\r\=newline=cr
0: abc
xyzabc\rpqr\=newline=cr
0: abc
xyzabc\r\n\=newline=crlf
0: abc
xyzabc\r\npqr\=newline=crlf
0: abc 0: abc
** Failers ** Failers
No match No match
xyzabc\r xyz\rabc
No match No match
xyzabc\rpqr xyzabc\r
No match No match
xyzabc\r\n xyzabc\rpqr
No match No match
xyzabc\r\npqr xyzabc\r\n
No match
xyzabc\r\npqr
No match
/^abc/Im,newline=crlf
Capturing subpattern count = 0
Options: multiline
Forced newline is CRLF
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
xyz\r\nabclf>
0: abc
** Failers
No match
xyz\nabclf
No match
xyz\rabclf
No match No match
/^abc/m,newline=cr /^abc/Im,newline=cr
xyz\rabcdef Capturing subpattern count = 0
Options: multiline
Forced newline is CR
First code unit at start or follows newline
Last code unit = 'c'
Subject length lower bound = 3
xyz\rabc
0: abc 0: abc
xyz\nabcdef\=newline=lf ** Failers
0: abc
** Failers
No match No match
xyz\nabcdef xyz\nabc
No match No match
xyz\r\nabc
/^abc/m,newline=lf
xyz\nabcdef
0: abc
xyz\rabcdef\=newline=cr
0: abc
** Failers
No match No match
xyz\rabcdef
No match /.*/I,newline=lf
Capturing subpattern count = 0
/^abc/m,newline=crlf May match empty string
xyz\r\nabcdef Forced newline is LF
0: abc First code unit at start or follows newline
xyz\rabcdef\=newline=cr Subject length lower bound = 0
0: abc
** Failers
No match
xyz\rabcdef
No match
/.*/newline=lf
abc\ndef abc\ndef
0: abc 0: abc
abc\rdef abc\rdef
0: abc\x0ddef 0: abc\x0ddef
abc\r\ndef abc\r\ndef
0: abc\x0d 0: abc\x0d
abc\ndef\=newline=cr
/.*/I,newline=cr
Capturing subpattern count = 0
May match empty string
Forced newline is CR
First code unit at start or follows newline
Subject length lower bound = 0
abc\ndef
0: abc\x0adef 0: abc\x0adef
abc\rdef\=newline=cr abc\rdef
0: abc 0: abc
abc\r\ndef\=newline=cr abc\r\ndef
0: abc 0: abc
abc\ndef\=newline=crlf
/.*/I,newline=crlf
Capturing subpattern count = 0
May match empty string
Forced newline is CRLF
First code unit at start or follows newline
Subject length lower bound = 0
abc\ndef
0: abc\x0adef 0: abc\x0adef
abc\rdef\=newline=crlf abc\rdef
0: abc\x0ddef 0: abc\x0ddef
abc\r\ndef\=newline=crlf abc\r\ndef
0: abc 0: abc
/\w+(.)(.)?def/Is
Capturing subpattern count = 2
Options: dotall
Starting code units: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P
Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z
Last code unit = 'f'
Subject length lower bound = 5
abc\ndef
0: abc\x0adef
abc\rdef
0: abc\x0ddef
abc\r\ndef
0: abc\x0d\x0adef
/\w+(.)(.)?def/s /\w+(.)(.)?def/s
abc\ndef abc\ndef
0: abc\x0adef 0: abc\x0adef
@ -6397,17 +6406,35 @@ No match
/^a.b/newline=lf /^a.b/newline=lf
a\rb a\rb
0: a\x0db 0: a\x0db
a\nb\=newline=cr
0: a\x0ab
** Failers ** Failers
No match No match
a\nb a\nb
No match No match
a\nb\=newline=any
/^a.b/newline=cr
a\nb
0: a\x0ab
** Failers
No match No match
a\rb\=newline=cr a\rb
No match No match
a\rb\=newline=any
/^a.b/newline=anycrlf
a\x85b
0: a\x85b
** Failers
No match
a\rb
No match
/^a.b/newline=any
** Failers
No match
a\nb
No match
a\rb
No match
a\x85b
No match No match
/^abc./gmx,newline=any /^abc./gmx,newline=any
@ -6718,12 +6745,6 @@ Subject length lower bound = 3
0: a\x85b 0: a\x85b
a\x0bb a\x0bb
0: a\x0bb 0: a\x0bb
** Failers
No match
a\x85b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/a\R?b/I,bsr=anycrlf /a\R?b/I,bsr=anycrlf
Capturing subpattern count = 0 Capturing subpattern count = 0
@ -6760,12 +6781,6 @@ Subject length lower bound = 2
0: a\x85b 0: a\x85b
a\x0bb a\x0bb
0: a\x0bb 0: a\x0bb
** Failers
No match
a\x85b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/a\R{2,4}b/I,bsr=anycrlf /a\R{2,4}b/I,bsr=anycrlf
Capturing subpattern count = 0 Capturing subpattern count = 0
@ -6806,10 +6821,6 @@ No match
No match No match
a\r\r\r\r\rb a\r\r\r\r\rb
No match No match
a\x85\x85b\=bsr=anycrlf
No match
a\x0b\0bb\=bsr=anycrlf
No match
/a(?!)|\wbc/ /a(?!)|\wbc/
abc abc

12
testdata/testoutput7 vendored
View File

@ -1139,12 +1139,6 @@ Subject length lower bound = 3
0: a\x{85}b 0: a\x{85}b
a\x0bb a\x0bb
0: a\x{0b}b 0: a\x{0b}b
** Failers
No match
a\x{85}b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/a\R?b/I,bsr=anycrlf,utf /a\R?b/I,bsr=anycrlf,utf
Capturing subpattern count = 0 Capturing subpattern count = 0
@ -1183,12 +1177,6 @@ Subject length lower bound = 2
0: a\x{85}b 0: a\x{85}b
a\x0bb a\x0bb
0: a\x{0b}b 0: a\x{0b}b
** Failers
No match
a\x{85}b\=bsr=anycrlf
No match
a\x0bb\=bsr=anycrlf
No match
/X/newline=any,utf,firstline /X/newline=any,utf,firstline
A\x{1ec5}ABCXYZ A\x{1ec5}ABCXYZ