From 72d0ff85a355329ccd73f44009da2726ac8782b9 Mon Sep 17 00:00:00 2001 From: Syed Daanish Date: Mon, 3 Aug 2026 20:34:24 +0100 Subject: [PATCH] Fix searching api. --- include/vase/vase.h | 3 +-- src/vase/search.cc | 37 +++++++++++++++++++++++++++++-------- src/vase/vase.cc | 5 ++--- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/include/vase/vase.h b/include/vase/vase.h index d366863..e7ad451 100644 --- a/include/vase/vase.h +++ b/include/vase/vase.h @@ -46,8 +46,7 @@ struct Vase { void clamp(Point *point); void regex_search_replace( - std::string_view pattern, - Point start, Point end, + std::string_view pattern, Range range, std::string_view replace, std::string_view options ); diff --git a/src/vase/search.cc b/src/vase/search.cc index 1c9a699..710bd4e 100644 --- a/src/vase/search.cc +++ b/src/vase/search.cc @@ -44,28 +44,49 @@ std::vector regex_search( std::string out; out.reserve(pattern_str.size() * 2); - bool escaped = false; - - for (char c : pattern_str) { - // TODO: also dont switch out in [.] style groups. + bool in_class = false; + bool in_quote = false; + for (size_t i = 0; i < pattern_str.size(); i++) { + char c = pattern_str[i]; if (escaped) { out += c; escaped = false; continue; } - if (c == '\\') { out += c; + if (i + 1 < pattern_str.size()) { + char next = pattern_str[i + 1]; + if (next == 'Q') + in_quote = true; + else if (next == 'E') + in_quote = false; + out += next; + i++; + continue; + } escaped = true; continue; } - - if (c == '.') { + if (in_quote) { + out += c; + continue; + } + if (c == '[') { + in_class = true; + out += c; + continue; + } + if (c == ']' && in_class) { + in_class = false; + out += c; + continue; + } + if (c == '.' && !in_class) { out += dot; continue; } - out += c; } diff --git a/src/vase/vase.cc b/src/vase/vase.cc index 5efd044..3d422e0 100644 --- a/src/vase/vase.cc +++ b/src/vase/vase.cc @@ -385,11 +385,10 @@ std::vector parse_replace(AppendBuffer &buf, std::string_view s) { } void Vase::regex_search_replace( - std::string_view pattern, - Point start, Point end, + std::string_view pattern, Range range, std::string_view replace, std::string_view options ) { - std::vector matches = regex_search(root, pattern, offset_of(start), offset_of(end), options); + std::vector matches = regex_search(root, pattern, offset_of(range.start), offset_of(range.end), options); if (matches.empty()) return;