aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorK.Kosako <kkosako0@gmail.com>2024-05-24 10:25:56 +0900
committerK.Kosako <kkosako0@gmail.com>2024-05-24 10:25:56 +0900
commit42f0c3261a156c6176041782d5e6ada769d644af (patch)
tree557688270ea713ba6f3d7eb6b86d67445d52e0e6
parentbecc5b3e93b6e5d3a6bbf3f6efe56ad828928d27 (diff)
downloadoniguruma-42f0c3261a156c6176041782d5e6ada769d644af.zip
oniguruma-42f0c3261a156c6176041782d5e6ada769d644af.tar.gz
oniguruma-42f0c3261a156c6176041782d5e6ada769d644af.tar.bz2
fix #295: Invalid result for empty match with anchors
-rw-r--r--src/regexec.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/regexec.c b/src/regexec.c
index 496da3b..732f980 100644
--- a/src/regexec.c
+++ b/src/regexec.c
@@ -5427,6 +5427,7 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
OnigOptionType option, OnigMatchParam* mp)
{
int r;
+ int forward;
UChar *s;
MatchArg msa;
const UChar *orig_start = start;
@@ -5474,6 +5475,8 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
else goto finish; /* error */ \
}
+ forward = (range > start);
+
/* anchor optimize: resume search range */
if (reg->anchor != 0 && str < end) {
UChar *min_semi_end, *max_semi_end;
@@ -5595,7 +5598,7 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
MATCH_ARG_INIT(msa, reg, option, region, orig_start, mp);
s = (UChar* )start;
- if (range > start) { /* forward search */
+ if (forward != 0) { /* forward search */
if (reg->optimize != OPTIMIZE_NONE) {
UChar *sch_range, *low, *high;
@@ -5636,7 +5639,7 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
if ((reg->anchor & ANCR_ANYCHAR_INF) != 0 &&
(reg->anchor & (ANCR_LOOK_BEHIND | ANCR_PREC_READ_NOT)) == 0) {
- do {
+ while (s < range) {
UChar* prev;
MATCH_AND_RETURN_CHECK(data_range);
@@ -5647,19 +5650,16 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
prev = s;
s += enclen(reg->enc, s);
}
- } while (s < range);
+ }
goto mismatch;
}
}
}
- do {
+ while (1 == 1) {
MATCH_AND_RETURN_CHECK(data_range);
+ if (s >= range) break;
s += enclen(reg->enc, s);
- } while (s < range);
-
- if (s == range) { /* because empty match with /$/. */
- MATCH_AND_RETURN_CHECK(data_range);
}
}
else { /* backward search */