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]);
}
}
}