Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/89678c64c0a8c67a800e7ae10f49755a6330aa22
>---------------------------------------------------------------
commit 89678c64c0a8c67a800e7ae10f49755a6330aa22
Author: Alex Alabuzhev <
alab...@gmail.com>
Date: Sun Apr 24 17:16:55 2022 +0100
0003940: Editor crash when changing codepage to UTF16BE
>---------------------------------------------------------------
89678c64c0a8c67a800e7ae10f49755a6330aa22
far/changelog | 5 +++++
far/codepage_selection.cpp | 33 ++++++++++++++++++++++++++-------
far/encoding.cpp | 11 +++++++++++
far/vbuild.m4 | 2 +-
4 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/far/changelog b/far/changelog
index 33e91f773..b1121ef67 100644
--- a/far/changelog
+++ b/far/changelog
@@ -1,3 +1,8 @@
+--------------------------------------------------------------------------------
+drkns 24.04.2022 17:14:58 +0100 - build 5966
+
+1. 0003940: Editor crash when changing codepage to UTF16BE.
+
--------------------------------------------------------------------------------
drkns 18.04.2022 03:16:06 +0100 - build 5965
diff --git a/far/codepage_selection.cpp b/far/codepage_selection.cpp
index d457702af..ad1b90a47 100644
--- a/far/codepage_selection.cpp
+++ b/far/codepage_selection.cpp
@@ -303,6 +303,17 @@ size_t codepages::GetCodePageInsertPosition(uintptr_t codePage, size_t start, si
return Pos != iRange.cend()? *Pos : start + length;
}
+static string_view unicode_codepage_name(uintptr_t const Codepage)
+{
+ switch (Codepage)
+ {
+ case CP_UTF8: return L"UTF-8"sv;
+ case CP_UNICODE: return L"UTF-16 (Little endian)"sv;
+ case CP_REVERSEBOM: return L"UTF-16 (Big endian)"sv;
+ default: return {};
+ }
+}
+
// Добавляем все необходимые таблицы символов
void codepages::AddCodePages(DWORD codePages)
{
@@ -362,9 +373,9 @@ void codepages::AddCodePages(DWORD codePages)
// unicode codepages
//
AddSeparator(msg(lng::MGetCodePageUnicode));
- AddStandardCodePage(L"UTF-8"sv, CP_UTF8, -1, true);
- AddStandardCodePage(L"UTF-16 (Little endian)"sv, CP_UNICODE);
- AddStandardCodePage(L"UTF-16 (Big endian)"sv, CP_REVERSEBOM);
+ AddStandardCodePage(unicode_codepage_name(CP_UTF8), CP_UTF8, -1, true);
+ AddStandardCodePage(unicode_codepage_name(CP_UNICODE), CP_UNICODE);
+ AddStandardCodePage(unicode_codepage_name(CP_REVERSEBOM), CP_REVERSEBOM);
// other codepages
//
@@ -795,10 +806,18 @@ std::optional<cp_info> codepages::GetInfo(uintptr_t CodePage)
string codepages::FormatName(uintptr_t const CodePage)
{
- const auto Info = GetCodePageInfo(CodePage);
- auto Name = Info? Info->Name : L"Unknown"s;
- GetCodePageCustomName(CodePage, Name);
- return format(FSTR(L"{}: {}"sv), CodePage, Name);
+ const auto get_name = [&]
+ {
+ if (const auto Name = unicode_codepage_name(CodePage); !Name.empty())
+ return string(Name);
+
+ const auto Info = GetCodePageInfo(CodePage);
+ auto Name = Info? Info->Name : L"Unknown"s;
+ GetCodePageCustomName(CodePage, Name);
+ return Name;
+ };
+
+ return format(FSTR(L"{}: {}"sv), CodePage, get_name());
}
string codepages::UnsupportedCharacterMessage(wchar_t const Char)
diff --git a/far/encoding.cpp b/far/encoding.cpp
index 54cb6505c..ff1a56a8d 100644
--- a/far/encoding.cpp
+++ b/far/encoding.cpp
@@ -515,6 +515,15 @@ static size_t get_chars_impl(uintptr_t const Codepage, std::string_view Str, spa
if (Str.empty())
return 0;
+ const auto validate_unicode = [&]
+ {
+ if (Str.size() & 1 && Diagnostics && Diagnostics->EnabledDiagnostics & encoding::diagnostics::incomplete_bytes)
+ {
+ Diagnostics->ErrorPosition = Str.size() - 1;
+ Diagnostics->IncompleteBytes = 1;
+ }
+ };
+
switch (Codepage)
{
case CP_UTF8:
@@ -525,10 +534,12 @@ static size_t get_chars_impl(uintptr_t const Codepage, std::string_view Str, spa
case CP_UNICODE:
copy_memory(Str.data(), Buffer.data(), std::min(Str.size(), Buffer.size() * sizeof(wchar_t)));
+ validate_unicode();
return Str.size() / sizeof(wchar_t);
case CP_REVERSEBOM:
swap_bytes(Str.data(), Buffer.data(), std::min(Str.size(), Buffer.size() * sizeof(wchar_t)));
+ validate_unicode();
return Str.size() / sizeof(wchar_t);
default:
diff --git a/far/vbuild.m4 b/far/vbuild.m4
index bc6ec0d5e..106a6f984 100644
--- a/far/vbuild.m4
+++ b/far/vbuild.m4
@@ -1 +1 @@
-5965
+5966