@@ -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 }
0 commit comments