Fixes RegEx capture grabbing too much #9382

Incorrect behaviour was caused when next->test was throwing off the
results.
This commit is contained in:
Zher Huei Lee 2017-06-26 15:16:33 +08:00
parent 760cdbe1a3
commit 382db0898e

View file

@ -590,6 +590,11 @@ struct RegExNodeGroup : public RegExNode {
memdelete(childset[i]);
}
virtual void test_success(RegExSearch &s, int pos) const {
return;
}
virtual int test(RegExSearch &s, int pos) const {
for (int i = 0; i < childset.size(); ++i) {
@ -614,6 +619,7 @@ struct RegExNodeGroup : public RegExNode {
if (res >= 0) {
if (reset_pos)
res = pos;
this->test_success(s, res);
return next ? next->test(s, res) : res;
}
}
@ -668,6 +674,12 @@ struct RegExNodeCapturing : public RegExNodeGroup {
id = p_id;
}
virtual void test_success(RegExSearch &s, int pos) const {
RegExMatch::Group &ref = s.match->captures[id];
ref.length = pos - ref.start;
}
virtual int test(RegExSearch &s, int pos) const {
RegExMatch::Group &ref = s.match->captures[id];
@ -676,13 +688,8 @@ struct RegExNodeCapturing : public RegExNodeGroup {
int res = RegExNodeGroup::test(s, pos);
if (res >= 0) {
if (!s.complete)
ref.length = res - pos;
} else {
if (res < 0)
ref.start = old_start;
}
return res;
}