Fix pcre2test mishandling "end before start" return with POSIX interface.
This commit is contained in:
parent
eb5a1f7ac1
commit
a463d662e4
@ -317,6 +317,10 @@ just wastes time. In the UTF case it can also produce redundant entries in
|
||||
XCLASS lists caused by characters with multiple other cases and pairs of
|
||||
characters in the same "not-x" sublists.
|
||||
|
||||
49. A pattern such as /(?=(a\K))/ can report the end of the match being before
|
||||
its start; pcre2test was not handling this correctly when using the POSIX
|
||||
interface (it was OK with the native interface).
|
||||
|
||||
|
||||
Version 10.22 29-July-2016
|
||||
--------------------------
|
||||
|
@ -6184,18 +6184,27 @@ if ((pat_patctl.control & CTL_POSIX) != 0)
|
||||
{
|
||||
if (pmatch[i].rm_so >= 0)
|
||||
{
|
||||
PCRE2_SIZE start = pmatch[i].rm_so;
|
||||
PCRE2_SIZE end = pmatch[i].rm_eo;
|
||||
if (start > end)
|
||||
{
|
||||
start = pmatch[i].rm_eo;
|
||||
end = pmatch[i].rm_so;
|
||||
fprintf(outfile, "Start of matched string is beyond its end - "
|
||||
"displaying from end to start.\n");
|
||||
}
|
||||
fprintf(outfile, "%2d: ", (int)i);
|
||||
PCHARSV(pp, pmatch[i].rm_so,
|
||||
pmatch[i].rm_eo - pmatch[i].rm_so, utf, outfile);
|
||||
PCHARSV(pp, start, end - start, utf, outfile);
|
||||
fprintf(outfile, "\n");
|
||||
|
||||
if ((i == 0 && (dat_datctl.control & CTL_AFTERTEXT) != 0) ||
|
||||
(dat_datctl.control & CTL_ALLAFTERTEXT) != 0)
|
||||
{
|
||||
fprintf(outfile, "%2d+ ", (int)i);
|
||||
PCHARSV(pp, pmatch[i].rm_eo, len - pmatch[i].rm_eo,
|
||||
utf, outfile);
|
||||
fprintf(outfile, "\n");
|
||||
}
|
||||
/* Note: don't use the start/end variables here because we want to
|
||||
show the text from what is reported as the end. */
|
||||
PCHARSV(pp, pmatch[i].rm_eo, len - pmatch[i].rm_eo, utf, outfile);
|
||||
fprintf(outfile, "\n"); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
3
testdata/testinput18
vendored
3
testdata/testinput18
vendored
@ -106,4 +106,7 @@
|
||||
//posix_nosub
|
||||
\=offset=70000
|
||||
|
||||
/(?=(a\K))/
|
||||
a
|
||||
|
||||
# End of testdata/testinput18
|
||||
|
6
testdata/testoutput18
vendored
6
testdata/testoutput18
vendored
@ -162,4 +162,10 @@ Failed: POSIX code 4: ? * + invalid at offset 1000001
|
||||
** Ignored with POSIX interface: offset
|
||||
Matched with REG_NOSUB
|
||||
|
||||
/(?=(a\K))/
|
||||
a
|
||||
Start of matched string is beyond its end - displaying from end to start.
|
||||
0: a
|
||||
1: a
|
||||
|
||||
# End of testdata/testinput18
|
||||
|
Loading…
Reference in New Issue
Block a user