Skip to content

Commit 6fb7c99

Browse files
committed
Refactoring, tests
1 parent 9cf2e6c commit 6fb7c99

38 files changed

Lines changed: 560 additions & 319 deletions

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ body:
77
value: |
88
Please make sure to [search for existing issues](https://github.com/FarGroup/FarManager/issues), [check the FAQ](https://forum.farmanager.com/viewtopic.php?t=5207) and [reporting guidelines](https://farmanager.com/problems.php?l=en) before filing a new one.
99
10+
- type: checkboxes
11+
attributes:
12+
label: ' '
13+
options:
14+
- label: I have searched for existing issues and found nothing relevant
15+
required: true
16+
1017
- type: input
1118
attributes:
1219
label: Far Manager version
@@ -16,6 +23,15 @@ body:
1623
validations:
1724
required: true
1825

26+
- type: checkboxes
27+
attributes:
28+
label: ' '
29+
description: |
30+
#### Always try to update first. Your issue might be fixed already.
31+
options:
32+
- label: I confirm that this is the latest available version (including nightly builds)
33+
required: true
34+
1935
- type: input
2036
attributes:
2137
label: OS version
@@ -29,7 +45,7 @@ body:
2945
attributes:
3046
label: Other software
3147
description: If required to reproduce the issue.
32-
placeholder:
48+
placeholder: E.g. third party plugins you have installed.
3349
validations:
3450
required: false
3551

far/PluginA.cpp

Lines changed: 56 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -443,10 +443,10 @@ static void FreeUnicodeArrayMagic(const wchar_t* const* Array)
443443

444444
for (const auto& i: std::span(Array, Size))
445445
{
446-
delete[] i;
446+
std::unique_ptr<wchar_t const[]>{i};
447447
}
448448

449-
delete[] RealPtr;
449+
std::unique_ptr<wchar_t const* const[]>{RealPtr};
450450
}
451451

452452
static DWORD OldKeyToKey(DWORD dOldKey)
@@ -539,11 +539,11 @@ static void FreeUnicodeInfoPanelLines(std::span<const InfoPanelLine> const Lines
539539
{
540540
for (const auto& i: Lines)
541541
{
542-
delete[] i.Text;
543-
delete[] i.Data;
542+
std::unique_ptr<wchar_t const[]>{i.Text};
543+
std::unique_ptr<wchar_t const[]>{i.Data};
544544
}
545545

546-
delete[] Lines.data();
546+
std::unique_ptr<InfoPanelLine const[]>{Lines.data()};
547547
}
548548

549549
static void ConvertPanelModeToUnicode(const oldfar::PanelMode& Mode, PanelMode& UnicodeMode)
@@ -581,13 +581,13 @@ static void FreeUnicodePanelModes(std::span<PanelMode const> const Modes)
581581
{
582582
for (const auto& i: Modes)
583583
{
584-
delete[] i.ColumnTypes;
585-
delete[] i.ColumnWidths;
584+
std::unique_ptr<wchar_t const[]>{i.ColumnTypes};
585+
std::unique_ptr<wchar_t const[]>{i.ColumnWidths};
586586
FreeUnicodeArrayMagic(i.ColumnTitles);
587-
delete[] i.StatusColumnTypes;
588-
delete[] i.StatusColumnWidths;
587+
std::unique_ptr<wchar_t const[]>{i.StatusColumnTypes};
588+
std::unique_ptr<wchar_t const[]>{i.StatusColumnWidths};
589589
}
590-
delete[] Modes.data();
590+
std::unique_ptr<PanelMode const[]>{Modes.data()};
591591
}
592592

593593
static void ConvertKeyBarTitlesA(const oldfar::KeyBarTitles& kbtA, KeyBarTitles& kbtW, bool FullStruct = true)
@@ -663,15 +663,15 @@ static void FreeUnicodeKeyBarTitles(const KeyBarTitles& kbtW)
663663
{
664664
for (const auto& Item: std::span(kbtW.Labels, kbtW.CountLabels))
665665
{
666-
delete[] Item.Text;
666+
std::unique_ptr<wchar_t const[]>{Item.Text};
667667
}
668668

669-
delete[] kbtW.Labels;
669+
std::unique_ptr<KeyBarLabel[]>{kbtW.Labels};
670670
}
671671

672672
static void WINAPI FreeUserData(void* UserData, const FarPanelItemFreeInfo*)
673673
{
674-
delete[] static_cast<char*>(UserData);
674+
std::unique_ptr<char[]>{static_cast<char*>(UserData)};
675675
}
676676

677677
static const std::array PluginPanelItemFlagsMap
@@ -792,25 +792,27 @@ static void FreeUnicodePanelItem(PluginPanelItem *PanelItem, size_t ItemsNumber)
792792
{
793793
FreePluginPanelItemsData({ PanelItem, ItemsNumber });
794794

795-
delete[] PanelItem;
795+
std::unique_ptr<PluginPanelItem[]>{PanelItem};
796796
}
797797

798798
static void FreePanelItemA(std::span<const oldfar::PluginPanelItem> const PanelItem)
799799
{
800800
for (const auto& Item: PanelItem)
801801
{
802-
delete[] Item.Description;
803-
delete[] Item.Owner;
802+
std::unique_ptr<char[]>{Item.Description};
803+
std::unique_ptr<char[]>{Item.Owner};
804804

805-
DeleteRawArray(std::span(Item.CustomColumnData, Item.CustomColumnNumber));
805+
for (auto& i: std::span(Item.CustomColumnData, Item.CustomColumnNumber))
806+
std::unique_ptr<char[]>{i};
807+
std::unique_ptr<char*[]>{Item.CustomColumnData};
806808

807809
if (Item.Flags & oldfar::PPIF_USERDATA)
808810
{
809-
delete[] std::bit_cast<char*>(Item.UserData);
811+
std::unique_ptr<char[]>{std::bit_cast<char*>(Item.UserData)};
810812
}
811813
}
812814

813-
delete[] PanelItem.data();
815+
std::unique_ptr<oldfar::PluginPanelItem const[]>{PanelItem.data()};
814816
}
815817

816818
static char *InsertQuoteA(char *Str)
@@ -1138,9 +1140,9 @@ static void FreeUnicodeDialogItem(FarDialogItem const& di)
11381140
case DI_FIXEDIT:
11391141

11401142
if (di.Flags&DIF_HISTORY)
1141-
delete[] di.History;
1143+
std::unique_ptr<wchar_t const[]>{di.History};
11421144
else if (di.Flags&DIF_MASKEDIT)
1143-
delete[] di.Mask;
1145+
std::unique_ptr<wchar_t const[]>{di.Mask};
11441146
break;
11451147

11461148
case DI_LISTBOX:
@@ -1151,37 +1153,37 @@ static void FreeUnicodeDialogItem(FarDialogItem const& di)
11511153
{
11521154
for (const auto& i: std::span(di.ListItems->Items, di.ListItems->ItemsNumber))
11531155
{
1154-
delete[] i.Text;
1156+
std::unique_ptr<wchar_t const[]>{i.Text};
11551157
}
11561158

1157-
delete[] di.ListItems->Items;
1159+
std::unique_ptr<FarListItem[]>{di.ListItems->Items};
11581160
di.ListItems->Items = nullptr;
11591161
}
11601162
}
11611163
break;
11621164

11631165
case DI_USERCONTROL:
1164-
delete[] di.VBuf;
1166+
std::unique_ptr<FAR_CHAR_INFO[]>{di.VBuf};
11651167
break;
11661168

11671169
default:
11681170
break;
11691171
}
11701172

1171-
delete[] di.Data;
1173+
std::unique_ptr<wchar_t const[]>{di.Data};
11721174
}
11731175

11741176
static void FreeAnsiDialogItem(oldfar::FarDialogItem &diA)
11751177
{
11761178
if ((diA.Type == oldfar::DI_EDIT || diA.Type == oldfar::DI_FIXEDIT) && (diA.Flags&oldfar::DIF_HISTORY || diA.Flags&oldfar::DIF_MASKEDIT))
11771179
{
1178-
delete[] diA.History;
1180+
std::unique_ptr<char const[]>{diA.History};
11791181
diA.History = nullptr;
11801182
}
11811183

11821184
if ((diA.Type == oldfar::DI_EDIT || diA.Type == oldfar::DI_COMBOBOX) && diA.Flags&oldfar::DIF_VAREDIT)
11831185
{
1184-
delete[] diA.Ptr.PtrData;
1186+
std::unique_ptr<char[]>{diA.Ptr.PtrData};
11851187
diA.Ptr.PtrData = nullptr;
11861188
}
11871189
}
@@ -1878,7 +1880,7 @@ static char* WINAPI PasteFromClipboardA() noexcept
18781880
static void WINAPI DeleteBufferA(void* Buffer) noexcept
18791881
{
18801882
// noexcept
1881-
delete[] static_cast<char*>(Buffer);
1883+
std::unique_ptr<char[]>{static_cast<char*>(Buffer)};
18821884
}
18831885

18841886
static int WINAPI ProcessNameA(const char *Param1, char *Param2, DWORD Flags) noexcept
@@ -2390,7 +2392,7 @@ static int WINAPI FarMenuFnA(intptr_t PluginNumber, int X, int Y, int MaxHeight,
23902392

23912393
for (const auto& i: mi)
23922394
{
2393-
delete[] i.Text;
2395+
std::unique_ptr<wchar_t const[]>{i.Text};
23942396
}
23952397

23962398
return ret;
@@ -2824,7 +2826,7 @@ static intptr_t WINAPI FarSendDlgMessageA(HANDLE hDlg, int OldMsg, int Param1, v
28242826

28252827
for (const auto& i: Items)
28262828
{
2827-
delete[] i.Text;
2829+
std::unique_ptr<wchar_t const[]>{i.Text};
28282830
}
28292831

28302832
return ret;
@@ -2847,7 +2849,7 @@ static intptr_t WINAPI FarSendDlgMessageA(HANDLE hDlg, int OldMsg, int Param1, v
28472849

28482850
intptr_t ret = pluginapi::apiSendDlgMessage(hDlg, DM_LISTUPDATE, Param1, Param2? &newui : nullptr);
28492851

2850-
delete[] newui.Item.Text;
2852+
std::unique_ptr<wchar_t const[]>{newui.Item.Text};
28512853

28522854
return ret;
28532855
}
@@ -2864,7 +2866,7 @@ static intptr_t WINAPI FarSendDlgMessageA(HANDLE hDlg, int OldMsg, int Param1, v
28642866

28652867
intptr_t ret = pluginapi::apiSendDlgMessage(hDlg, DM_LISTINSERT, Param1, Param2? &newli : nullptr);
28662868

2867-
delete[] newli.Item.Text;
2869+
std::unique_ptr<wchar_t const[]>{newli.Item.Text};
28682870

28692871
return ret;
28702872
}
@@ -2883,7 +2885,7 @@ static intptr_t WINAPI FarSendDlgMessageA(HANDLE hDlg, int OldMsg, int Param1, v
28832885

28842886
intptr_t ret = pluginapi::apiSendDlgMessage(hDlg, DM_LISTFINDSTRING, Param1, Param2? &newlf : nullptr);
28852887

2886-
delete[] newlf.Pattern;
2888+
std::unique_ptr<wchar_t const[]>{newlf.Pattern};
28872889

28882890
return ret;
28892891
}
@@ -2999,7 +3001,7 @@ static intptr_t WINAPI FarSendDlgMessageA(HANDLE hDlg, int OldMsg, int Param1, v
29993001
else
30003002
{
30013003
FarDialogItem& di = CurrentDialogItem(hDlg,Param1);
3002-
delete[] di.History;
3004+
std::unique_ptr<wchar_t const[]>{di.History};
30033005
di.History = AnsiToUnicode(static_cast<const char*>(Param2));
30043006
return pluginapi::apiSendDlgMessage(hDlg, DM_SETHISTORY, Param1, const_cast<wchar_t*>(di.History));
30053007
}
@@ -3035,10 +3037,10 @@ static intptr_t WINAPI FarSendDlgMessageA(HANDLE hDlg, int OldMsg, int Param1, v
30353037
{
30363038
for (const auto& i: std::span(newlist.Items, newlist.ItemsNumber))
30373039
{
3038-
delete[] i.Text;
3040+
std::unique_ptr<wchar_t const[]>{i.Text};
30393041
}
30403042

3041-
delete[] newlist.Items;
3043+
std::unique_ptr<FarListItem[]>{newlist.Items};
30423044
}
30433045

30443046
return ret;
@@ -3746,7 +3748,7 @@ static intptr_t WINAPI FarAdvControlA(intptr_t ModuleNumber, oldfar::ADVANCED_CO
37463748
kmA->MacroResult.ErrMsg3 = "";
37473749
[[fallthrough]];
37483750
case MSSC_POST:
3749-
delete[] mtW.SequenceText;
3751+
std::unique_ptr<wchar_t const[]>{mtW.SequenceText};
37503752
break;
37513753
}
37523754
}
@@ -4275,8 +4277,8 @@ static int WINAPI FarEditorControlA(oldfar::EDITOR_CONTROL_COMMANDS OldCommand,
42754277

42764278
const auto ret = static_cast<int>(pluginapi::apiEditorControl(-1, ECTL_SETSTRING, 0, Param? &newss : nullptr));
42774279

4278-
delete[] newss.StringText;
4279-
delete[] newss.StringEOL;
4280+
std::unique_ptr<wchar_t const[]>{newss.StringText};
4281+
std::unique_ptr<wchar_t const[]>{newss.StringEOL};
42804282

42814283
return ret;
42824284
}
@@ -5469,18 +5471,18 @@ WARNING_POP()
54695471
{
54705472
for (const auto& i: std::span(Item.Strings, Item.Count))
54715473
{
5472-
delete[] i;
5474+
std::unique_ptr<wchar_t const[]>{i};
54735475
}
54745476

5475-
delete[] Item.Guids;
5476-
delete[] Item.Strings;
5477+
std::unique_ptr<UUID const[]>{Item.Guids};
5478+
std::unique_ptr<wchar_t const* const[]>{Item.Strings};
54775479
};
54785480

54795481
DeleteItems(PI.DiskMenu);
54805482
DeleteItems(PI.PluginMenu);
54815483
DeleteItems(PI.PluginConfig);
54825484

5483-
delete[] PI.CommandPrefix;
5485+
std::unique_ptr<wchar_t const[]>{PI.CommandPrefix};
54845486

54855487
PI = {};
54865488
}
@@ -5538,19 +5540,23 @@ WARNING_POP()
55385540

55395541
void FreeOpenPanelInfo()
55405542
{
5541-
delete[] OPI.CurDir;
5542-
delete[] OPI.HostFile;
5543-
delete[] OPI.Format;
5544-
delete[] OPI.PanelTitle;
5543+
std::unique_ptr<wchar_t const[]>{OPI.CurDir};
5544+
std::unique_ptr<wchar_t const[]>{OPI.HostFile};
5545+
std::unique_ptr<wchar_t const[]>{OPI.Format};
5546+
std::unique_ptr<wchar_t const[]>{OPI.PanelTitle};
55455547
FreeUnicodeInfoPanelLines({ OPI.InfoLines, OPI.InfoLinesNumber });
5546-
DeleteRawArray(std::span(OPI.DescrFiles, OPI.DescrFilesNumber));
5548+
5549+
for (auto& i: std::span(OPI.DescrFiles, OPI.DescrFilesNumber))
5550+
std::unique_ptr<wchar_t const[]>{i};
5551+
std::unique_ptr<wchar_t const* const[]>{OPI.DescrFiles};
5552+
55475553
FreeUnicodePanelModes({ OPI.PanelModesArray, OPI.PanelModesNumber });
55485554
if (OPI.KeyBar)
55495555
{
55505556
FreeUnicodeKeyBarTitles(*OPI.KeyBar);
5551-
delete OPI.KeyBar;
5557+
std::unique_ptr<KeyBarTitles const>{OPI.KeyBar};
55525558
}
5553-
delete[] OPI.ShortcutData;
5559+
std::unique_ptr<wchar_t const[]>{OPI.ShortcutData};
55545560
OPI = {};
55555561
}
55565562

far/changelog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
--------------------------------------------------------------------------------
2+
drkns 2026-04-28 21:51:48+01:00 - build 6679
3+
4+
1. Refactoring, tests.
5+
16
--------------------------------------------------------------------------------
27
MZK 2026-04-18 10:27:01-04:00 - build 6678
38

0 commit comments

Comments
 (0)