Skip to content

Commit e21636d

Browse files
committed
RegExpControl +RECTL_GETSTATUS
1 parent 095e768 commit e21636d

File tree

4 files changed

+81
-27
lines changed

4 files changed

+81
-27
lines changed

far/changelog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
--------------------------------------------------------------------------------
2+
w17 2025-11-04 18:20:17+03:00 - build 6584
3+
4+
1. RegExpControl: + RECTL_GETSTATUS
5+
16
--------------------------------------------------------------------------------
27
drkns 2025-11-03 21:13:53+00:00 - build 6583
38

far/plugapi.cpp

Lines changed: 67 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2582,6 +2582,23 @@ static intptr_t WINAPI apiRegExpControl(HANDLE hHandle, FAR_REGEXP_CONTROL_COMMA
25822582
{
25832583
RegExp Regex;
25842584
std::vector<RegExpNamedGroup> NamedGroupsFlat;
2585+
std::wstring LastError;
2586+
intptr_t LastPos{};
2587+
int LastStatus{};
2588+
2589+
void clear_status()
2590+
{
2591+
LastError.clear();
2592+
LastPos = 0;
2593+
LastStatus = 0;
2594+
}
2595+
2596+
void set_status(const regex_exception& e)
2597+
{
2598+
LastError = e.message();
2599+
LastPos = e.position();
2600+
LastStatus = static_cast<int>(e.code());
2601+
}
25852602
};
25862603

25872604
switch (Command)
@@ -2595,18 +2612,22 @@ static intptr_t WINAPI apiRegExpControl(HANDLE hHandle, FAR_REGEXP_CONTROL_COMMA
25952612
return true;
25962613

25972614
case RECTL_COMPILE:
2615+
{
2616+
auto& Handle = *static_cast<regex_handle*>(hHandle);
25982617
try
25992618
{
2600-
auto& Handle = *static_cast<regex_handle*>(hHandle);
2619+
Handle.clear_status();
26012620
Handle.NamedGroupsFlat.clear();
26022621
Handle.Regex.Compile(static_cast<const wchar_t*>(Param2), OP_PERLSTYLE);
26032622
return true;
26042623
}
26052624
catch (regex_exception const& e)
26062625
{
26072626
LOGERROR(L"RECTL_COMPILE error: {}; position {}"sv, e.message(), e.position());
2627+
Handle.set_status(e);
26082628
return false;
26092629
}
2630+
}
26102631

26112632
case RECTL_OPTIMIZE:
26122633
return static_cast<regex_handle*>(hHandle)->Regex.Optimize();
@@ -2615,20 +2636,30 @@ static intptr_t WINAPI apiRegExpControl(HANDLE hHandle, FAR_REGEXP_CONTROL_COMMA
26152636
case RECTL_SEARCHEX:
26162637
{
26172638
auto& Handle = *static_cast<regex_handle*>(hHandle);
2618-
const auto data = static_cast<RegExpSearch*>(Param2);
2619-
regex_match Match;
2639+
try
2640+
{
2641+
Handle.clear_status();
2642+
const auto data = static_cast<RegExpSearch*>(Param2);
2643+
regex_match Match;
26202644

2621-
const auto Handler = Command == RECTL_SEARCHEX?
2622-
&RegExp::SearchEx :
2623-
&RegExp::MatchEx;
2645+
const auto Handler = Command == RECTL_SEARCHEX?
2646+
&RegExp::SearchEx :
2647+
&RegExp::MatchEx;
26242648

2625-
if (!(Handle.Regex.*Handler)({ data->Text, static_cast<size_t>(data->Length) }, data->Position, Match))
2626-
return false;
2649+
if (!(Handle.Regex.*Handler)({ data->Text, static_cast<size_t>(data->Length) }, data->Position, Match))
2650+
return false;
26272651

2628-
const auto MaxSize = std::min(static_cast<size_t>(data->Count), Match.Matches.size());
2629-
std::copy_n(Match.Matches.cbegin(), MaxSize, data->Match);
2630-
data->Count = MaxSize;
2631-
return true;
2652+
const auto MaxSize = std::min(static_cast<size_t>(data->Count), Match.Matches.size());
2653+
std::copy_n(Match.Matches.cbegin(), MaxSize, data->Match);
2654+
data->Count = MaxSize;
2655+
return true;
2656+
}
2657+
catch (regex_exception const& e)
2658+
{
2659+
LOGERROR(L"RECTL_{}CHEX error: {}; position {}"sv, Command == RECTL_SEARCHEX ? L"SEAR"s : L"MAT"s, e.message(), e.position());
2660+
Handle.set_status(e);
2661+
return false;
2662+
}
26322663
}
26332664

26342665
case RECTL_BRACKETSCOUNT:
@@ -2644,25 +2675,35 @@ static intptr_t WINAPI apiRegExpControl(HANDLE hHandle, FAR_REGEXP_CONTROL_COMMA
26442675
}
26452676

26462677
case RECTL_GETNAMEDGROUPS:
2647-
{
2648-
auto& Handle = *static_cast<regex_handle*>(hHandle);
2678+
{
2679+
auto& Handle = *static_cast<regex_handle*>(hHandle);
26492680

2650-
if (Handle.NamedGroupsFlat.empty())
2681+
if (Handle.NamedGroupsFlat.empty())
2682+
{
2683+
const auto& NamedGroups = Handle.Regex.GetNamedGroups();
2684+
Handle.NamedGroupsFlat.reserve(NamedGroups.size());
2685+
std::ranges::transform(NamedGroups, std::back_inserter(Handle.NamedGroupsFlat), [](const auto& i)
26512686
{
2652-
const auto& NamedGroups = Handle.Regex.GetNamedGroups();
2653-
Handle.NamedGroupsFlat.reserve(NamedGroups.size());
2654-
std::ranges::transform(NamedGroups, std::back_inserter(Handle.NamedGroupsFlat), [](const auto& i)
2655-
{
2656-
return RegExpNamedGroup{ i.second, i.first.c_str() };
2657-
});
2687+
return RegExpNamedGroup{ i.second, i.first.c_str() };
2688+
});
26582689

2659-
std::ranges::sort(Handle.NamedGroupsFlat, {}, &RegExpNamedGroup::Index);
2660-
}
2661-
2662-
*static_cast<RegExpNamedGroup const**>(Param2) = Handle.NamedGroupsFlat.data();
2663-
return Handle.NamedGroupsFlat.size();
2690+
std::ranges::sort(Handle.NamedGroupsFlat, {}, &RegExpNamedGroup::Index);
26642691
}
26652692

2693+
*static_cast<RegExpNamedGroup const**>(Param2) = Handle.NamedGroupsFlat.data();
2694+
return Handle.NamedGroupsFlat.size();
2695+
}
2696+
2697+
case RECTL_GETSTATUS:
2698+
{
2699+
auto& Handle = *static_cast<regex_handle*>(hHandle);
2700+
auto& Status = *static_cast<RegExpStatus*>(Param2);
2701+
Status.Error = Handle.LastError.c_str();
2702+
Status.Position = Handle.LastPos;
2703+
Status.Status = Handle.LastStatus;
2704+
return true;
2705+
}
2706+
26662707
default:
26672708
return false;
26682709
}

far/plugin.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,6 +2190,7 @@ enum FAR_REGEXP_CONTROL_COMMANDS
21902190
RECTL_BRACKETSCOUNT = 6,
21912191
RECTL_NAMEDGROUPINDEX = 7,
21922192
RECTL_GETNAMEDGROUPS = 8,
2193+
RECTL_GETSTATUS = 9,
21932194
};
21942195

21952196
struct RegExpMatch
@@ -2213,6 +2214,13 @@ struct RegExpNamedGroup
22132214
const wchar_t* Name;
22142215
};
22152216

2217+
struct RegExpStatus
2218+
{
2219+
const wchar_t* Error; // Error description
2220+
intptr_t Position; // position in regex pattern
2221+
int Status; // 0 - ok
2222+
};
2223+
22162224
enum FAR_SETTINGS_CONTROL_COMMANDS
22172225
{
22182226
SCTL_CREATE = 0,

far/vbuild.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6583
1+
6584

0 commit comments

Comments
 (0)