[FarGroup/FarManager] master: Refactoring: reduce std::regex usage (18ac330ef)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
May 26, 2024, 7:45:45 PMMay 26
to farco...@googlegroups.com
Repository : https://github.com/FarGroup/FarManager
On branch : master
Link : https://github.com/FarGroup/FarManager/commit/18ac330ef66a7cf1daec209c9fd1ff25c4d36db2

>---------------------------------------------------------------

commit 18ac330ef66a7cf1daec209c9fd1ff25c4d36db2
Author: Alex Alabuzhev <alab...@gmail.com>
Date: Mon May 27 00:36:18 2024 +0100

Refactoring: reduce std::regex usage


>---------------------------------------------------------------

18ac330ef66a7cf1daec209c9fd1ff25c4d36db2
far/configdb.cpp | 4 +---
far/pathmix.cpp | 2 ++
far/strmix.cpp | 34 +++++++++++++++++++++-------------
3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/far/configdb.cpp b/far/configdb.cpp
index b411ee2ec..1a4092e94 100644
--- a/far/configdb.cpp
+++ b/far/configdb.cpp
@@ -2358,9 +2358,7 @@ private:

bool is_uuid(string_view const Str)
{
- // "HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH"
- static const std::wregex re(RE_BEGIN RE_ANY_UUID RE_END, std::regex::optimize);
- return std::regex_search(ALL_CONST_RANGE(Str), re);
+ return uuid::try_parse(Str).has_value();
}

}
diff --git a/far/pathmix.cpp b/far/pathmix.cpp
index c4b4dcec2..8321284bf 100644
--- a/far/pathmix.cpp
+++ b/far/pathmix.cpp
@@ -119,6 +119,8 @@ root_type ParsePath(const string_view Path, size_t* const RootSize, bool* const
// Doing it manually should be way faster than letting wregex delegate it to OS locale facilities.
const auto re = [](const wchar_t* const Str) { return std::wregex(Str, std::regex::optimize); };

+
+ // TODO: get rid of regexes
static const struct
{
root_type Type;
diff --git a/far/strmix.cpp b/far/strmix.cpp
index 5781173c0..bddf9956f 100644
--- a/far/strmix.cpp
+++ b/far/strmix.cpp
@@ -687,9 +687,18 @@ bool FindWordInString(string_view const Str, size_t CurPos, size_t& Begin, size_

bool CheckFileSizeStringFormat(string_view const FileSizeStr)
{
- // NumberSuffix
- static const std::wregex SizeRegex(RE_BEGIN RE_ANY_OF(L"0-9") RE_ONE_OR_MORE_LAZY RE_ANY_OF(L"BbKkMmGgTtPpEe") RE_ZERO_OR_ONE_GREEDY RE_END, std::regex::optimize);
- return std::regex_search(ALL_CONST_RANGE(FileSizeStr), SizeRegex);
+ // <Number>[Suffix]
+ const auto Iterator = std::ranges::find_if_not(FileSizeStr, std::iswdigit);
+ if (Iterator == FileSizeStr.cbegin())
+ return false;
+
+ if (Iterator == FileSizeStr.cend())
+ return true;
+
+ if (Iterator + 1 != FileSizeStr.cend())
+ return false;
+
+ return contains(L"BbKkMmGgTtPpEe"sv, *Iterator);
}

unsigned long long ConvertFileSizeString(string_view const FileSizeStr)
@@ -757,18 +766,17 @@ string ReplaceBrackets(
else if (NamedMatch)
{
// {some text}
- static const std::wregex re(RE_BEGIN RE_ESCAPE(L"{") RE_C_GROUP(RE_ANY_OF(L"\\w\\s") RE_ZERO_OR_MORE_LAZY) RE_ESCAPE(L"}"), std::regex::optimize);
- std::match_results<string_view::const_iterator> CMatch;
- if (const auto Part = ReplaceStr.substr(TokenStart); std::regex_search(ALL_CONST_RANGE(Part), CMatch, re))
+ const auto Part = ReplaceStr.substr(TokenStart);
+
+ if (const auto MatchFirst = Part.find(L'{'); MatchFirst != Part.npos)
{
- TokenSize = CMatch[0].length();
- if (const auto Iterator = NamedMatch->Matches.find(string_view{ CMatch[1].first, CMatch[1].second }); Iterator != NamedMatch->Matches.cend())
- {
- Replacement = get_match(SearchStr, Match[Iterator->second]);
- }
- else
+ if (const auto MatchLast = Part.find(L'}', MatchFirst + 1); MatchLast != Part.npos)
{
- Replacement = ReplaceStr.substr(i, CMatch.length() + 1);
+ TokenSize = MatchLast - MatchFirst + 1;
+ const auto Iterator = NamedMatch->Matches.find(Part.substr(MatchFirst + 1, TokenSize - 2));
+ Replacement = Iterator == NamedMatch->Matches.cend()?
+ ReplaceStr.substr(i, TokenSize + 1) :
+ get_match(SearchStr, Match[Iterator->second]);
}
}
}


Reply all
Reply to author
Forward
0 new messages