14 Star 0 Fork 38

src-openEuler/pcre2

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
backport-Remove-incorrect-optimization-in-DFA-matching-when-p.patch 3.46 KB
一键复制 编辑 原始数据 按行查看 历史
From 674b6640e702705e8e90125f972197fae3aa364d Mon Sep 17 00:00:00 2001
From: Philip Hazel <[email protected]>
Date: Sat, 3 Aug 2024 17:18:56 +0100
Subject: [PATCH] Remove incorrect optimization in DFA matching when partial
matching and (*F) are involved
Conflict:don't modify ChangeLog; adapt context
Reference:https://github.com/PCRE2Project/pcre2/commit/674b6640e702705e8e90125f972197fae3aa364d
---
src/pcre2_dfa_match.c | 10 +---------
testdata/testinput6 | 9 +++++++++
testdata/testoutput6 | 13 +++++++++++++
3 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/src/pcre2_dfa_match.c b/src/pcre2_dfa_match.c
index 60f6b4f..1c4495f 100644
--- a/src/pcre2_dfa_match.c
+++ b/src/pcre2_dfa_match.c
@@ -7,7 +7,7 @@ and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel
Original API code Copyright (c) 1997-2012 University of Cambridge
- New API code Copyright (c) 2016-2022 University of Cambridge
+ New API code Copyright (c) 2016-2024 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
@@ -693,7 +693,6 @@ for (;;)
int i, j;
int clen, dlen;
uint32_t c, d;
- int forced_fail = 0;
BOOL partial_newline = FALSE;
BOOL could_continue = reset_could_continue;
reset_could_continue = FALSE;
@@ -2765,7 +2764,6 @@ for (;;)
though the other "backtracking verbs" are not supported. */
case OP_FAIL:
- forced_fail++; /* Count FAILs for multiple states */
break;
case OP_ASSERT:
@@ -3247,18 +3245,12 @@ for (;;)
matches that we are going to find. If partial matching has been requested,
check for appropriate conditions.
- The "forced_ fail" variable counts the number of (*F) encountered for the
- character. If it is equal to the original active_count (saved in
- workspace[1]) it means that (*F) was found on every active state. In this
- case we don't want to give a partial match.
-
The "could_continue" variable is true if a state could have continued but
for the fact that the end of the subject was reached. */
if (new_count <= 0)
{
if (could_continue && /* Some could go on, and */
- forced_fail != workspace[1] && /* Not all forced fail & */
( /* either... */
(mb->moptions & PCRE2_PARTIAL_HARD) != 0 /* Hard partial */
|| /* or... */
diff --git a/testdata/testinput6 b/testdata/testinput6
index 0ca0d23..b71a69c 100644
--- a/testdata/testinput6
+++ b/testdata/testinput6
@@ -4392,9 +4392,18 @@
/Z(*F)Q|ZXY/
Z\=ps
+ XY\=dfa_restart
\= Expect no match
ZA\=ps
X\=ps
+
+/Z(?:(*F)Q|XY)/
+ Z\=ps
+ XY\=dfa_restart
+
+/Z(*F)Q|Z(*F)XY/
+\= Expect no match
+ Z\=ps
/\bthe cat\b/
the cat\=ps
diff --git a/testdata/testoutput6 b/testdata/testoutput6
index 607b572..38c653e 100644
--- a/testdata/testoutput6
+++ b/testdata/testoutput6
@@ -6769,11 +6769,24 @@ Partial match: dogs
/Z(*F)Q|ZXY/
Z\=ps
Partial match: Z
+ XY\=dfa_restart
+ 0: XY
\= Expect no match
ZA\=ps
No match
X\=ps
No match
+
+/Z(?:(*F)Q|XY)/
+ Z\=ps
+Partial match: Z
+ XY\=dfa_restart
+ 0: XY
+
+/Z(*F)Q|Z(*F)XY/
+\= Expect no match
+ Z\=ps
+No match
/\bthe cat\b/
the cat\=ps
--
2.43.0
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/pcre2.git
[email protected]:src-openeuler/pcre2.git
src-openeuler
pcre2
pcre2
master

搜索帮助