From b2a54b84162e01d41548ddff13ae3fca70ebd1aa Mon Sep 17 00:00:00 2001 From: "O. Perret" Date: Sun, 27 Dec 2015 15:53:03 +0100 Subject: [PATCH 1/3] Add reverse search unit tests --- test/unit/search-reverse-rightmost/missed-match/cmd | 1 + test/unit/search-reverse-rightmost/missed-match/in | 1 + test/unit/search-reverse-rightmost/missed-match/selections | 1 + test/unit/search-reverse-rightmost/overlap/cmd | 1 + test/unit/search-reverse-rightmost/overlap/in | 1 + test/unit/search-reverse-rightmost/overlap/selections | 1 + 6 files changed, 6 insertions(+) create mode 100644 test/unit/search-reverse-rightmost/missed-match/cmd create mode 100644 test/unit/search-reverse-rightmost/missed-match/in create mode 100644 test/unit/search-reverse-rightmost/missed-match/selections create mode 100644 test/unit/search-reverse-rightmost/overlap/cmd create mode 100644 test/unit/search-reverse-rightmost/overlap/in create mode 100644 test/unit/search-reverse-rightmost/overlap/selections diff --git a/test/unit/search-reverse-rightmost/missed-match/cmd b/test/unit/search-reverse-rightmost/missed-match/cmd new file mode 100644 index 00000000..2e666042 --- /dev/null +++ b/test/unit/search-reverse-rightmost/missed-match/cmd @@ -0,0 +1 @@ +(ab|baba) diff --git a/test/unit/search-reverse-rightmost/missed-match/in b/test/unit/search-reverse-rightmost/missed-match/in new file mode 100644 index 00000000..88a28c1f --- /dev/null +++ b/test/unit/search-reverse-rightmost/missed-match/in @@ -0,0 +1 @@ +ababa%(b) diff --git a/test/unit/search-reverse-rightmost/missed-match/selections b/test/unit/search-reverse-rightmost/missed-match/selections new file mode 100644 index 00000000..0e46b314 --- /dev/null +++ b/test/unit/search-reverse-rightmost/missed-match/selections @@ -0,0 +1 @@ +baba diff --git a/test/unit/search-reverse-rightmost/overlap/cmd b/test/unit/search-reverse-rightmost/overlap/cmd new file mode 100644 index 00000000..d9568408 --- /dev/null +++ b/test/unit/search-reverse-rightmost/overlap/cmd @@ -0,0 +1 @@ +... diff --git a/test/unit/search-reverse-rightmost/overlap/in b/test/unit/search-reverse-rightmost/overlap/in new file mode 100644 index 00000000..c4144a07 --- /dev/null +++ b/test/unit/search-reverse-rightmost/overlap/in @@ -0,0 +1 @@ +abcdefg%(h) diff --git a/test/unit/search-reverse-rightmost/overlap/selections b/test/unit/search-reverse-rightmost/overlap/selections new file mode 100644 index 00000000..1505b408 --- /dev/null +++ b/test/unit/search-reverse-rightmost/overlap/selections @@ -0,0 +1 @@ +efg From 6a8507ce40cd5ed1cfa407256185aa303c01cd74 Mon Sep 17 00:00:00 2001 From: "O. Perret" Date: Sun, 27 Dec 2015 16:09:37 +0100 Subject: [PATCH 2/3] Keep match whose end is closest to the selection in reverse regex search. --- src/selectors.hh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/selectors.hh b/src/selectors.hh index 442a93c8..f718cbd3 100644 --- a/src/selectors.hh +++ b/src/selectors.hh @@ -239,13 +239,12 @@ inline bool find_last_match(const Buffer& buffer, const BufferIterator& pos, const bool is_pos_eol = is_eol(buffer, pos.coord()); const bool is_pos_eow = is_eow(buffer, pos.coord()); auto begin = buffer.begin(); - while (regex_search(begin, pos, matches, regex, - match_flags(is_bol(begin.coord()), is_pos_eol, is_pos_eow))) + while (begin != pos and regex_search(begin, pos, matches, regex, + match_flags(is_bol(begin.coord()), is_pos_eol, is_pos_eow))) { - if (begin == matches[0].second) - break; - begin = matches[0].second; - res.swap(matches); + begin = utf8::next(matches[0].first, pos); + if (res.empty() or matches[0].second > res[0].second) + res.swap(matches); } return not res.empty(); }