View Issue Details

IDProjectCategoryView StatusLast Update
0002872WishesUser Menupublic2015-07-08 23:32
ReporterMaximusAssigned ToDrKnS 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version3.0 
Target VersionFixed in Version3.0 
Summary0002872: Не ломать кодовую страницу файла FarMenu.ini
DescriptionМне удобно держать FarMenu.ini в UTF-8. Например, удобно изменения в гите смотреть.
Фар такой файл нормально читает, но при любых изменениях через интерфейс - пересохраняет в CP_UNICODE. Приходится каждый раз его открывать в редакторе (с проблемами кодировки) и пересохранять в UTF-8.
TagsNo tags attached.
Build4351

Activities

Maximus

2014-12-01 12:03

reporter  

0001-Implement-CachedWrite-WriteStr-considering-requested.patch (2,540 bytes)
From 652083cbb2575163edb15618d92fed587754c1e6 Mon Sep 17 00:00:00 2001
From: Maximus5 <ConEmu.Maximus5@gmail.com>
Date: Fri, 28 Nov 2014 20:03:44 +0300
Subject: [PATCH 1/2] Implement CachedWrite::WriteStr considering requested
 codepage

---
 unicode_far/cache.cpp | 37 +++++++++++++++++++++++++++++++++++--
 unicode_far/cache.hpp |  4 +++-
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/unicode_far/cache.cpp b/unicode_far/cache.cpp
index 6645a29..fa3ed2e 100644
--- a/unicode_far/cache.cpp
+++ b/unicode_far/cache.cpp
@@ -188,11 +188,12 @@ bool CachedRead::FillBuffer()
 	return Result;
 }
 
-CachedWrite::CachedWrite(api::File& file):
+CachedWrite::CachedWrite(api::File& file, uintptr_t codepage):
 	file(file),
 	Buffer(0x10000),
 	FreeSize(Buffer.size()),
-	Flushed(false)
+	Flushed(false),
+	codepage(codepage)
 {
 }
 
@@ -233,6 +234,38 @@ bool CachedWrite::Write(LPCVOID Data, size_t DataSize)
 	return Result;
 }
 
+bool CachedWrite::WriteStr(const wchar_t* SaveStr, size_t Length)
+{
+	if (!Length)
+		return true;
+
+	if (codepage == CP_UNICODE)
+	{
+		return Write(SaveStr, Length*sizeof(wchar_t));
+	}
+	else
+	{
+		auto SwapBytes = [](const wchar_t* src, char* dst, size_t count)
+		{
+			return _swab(reinterpret_cast<char*>(const_cast<wchar_t*>(src)), dst, static_cast<int>(count));
+		};
+
+		DWORD length = (codepage == CP_REVERSEBOM?static_cast<DWORD>(Length*sizeof(wchar_t)):WideCharToMultiByte(codepage, 0, SaveStr, Length, nullptr, 0, nullptr, nullptr));
+		char_ptr SaveStrCopy(length);
+
+		if (SaveStrCopy)
+		{
+			if (codepage == CP_REVERSEBOM)
+				SwapBytes(SaveStr, SaveStrCopy.get(), length);
+			else
+				WideCharToMultiByte(codepage, 0, SaveStr, Length, SaveStrCopy.get(), length, nullptr, nullptr);
+
+			return Write(SaveStrCopy.get(),length);
+		}
+	}
+	return false;
+}
+
 bool CachedWrite::Flush()
 {
 	if (!Flushed)
diff --git a/unicode_far/cache.hpp b/unicode_far/cache.hpp
index 75fa6ad..c0fadba 100644
--- a/unicode_far/cache.hpp
+++ b/unicode_far/cache.hpp
@@ -57,9 +57,10 @@ private:
 class CachedWrite: NonCopyable
 {
 public:
-	CachedWrite(api::File& file);
+	CachedWrite(api::File& file, uintptr_t codepage = CP_UNICODE);
 	~CachedWrite();
 	bool Write(LPCVOID Data, size_t DataSize);
+	bool WriteStr(const wchar_t* SaveStr, size_t Length);
 	bool Flush();
 
 private:
@@ -67,4 +68,5 @@ private:
 	std::vector<BYTE> Buffer;
 	size_t FreeSize;
 	bool Flushed;
+	uintptr_t codepage;
 };
-- 
1.9.4.msysgit.2

Maximus

2014-12-01 12:03

reporter  

2useven10

2014-12-01 14:20

developer   bugnote:0013292

может быть просто всегда сохранять в UTF-8 ?

Maximus

2014-12-01 14:24

reporter   bugnote:0013293

Я за. А кому-то понадобится KOI8-R. Не?

vskirdin

2014-12-01 15:58

administrator   bugnote:0013294

<off>
KOI-8 понадобится M$ :-)
У них до сих пор в клиенте Outlook эта кодировка дефолтовая.
</off>

NightRoman

2015-04-15 18:03

reporter   bugnote:0013635

Голосую за (хоть за сохранение кодировки, хоть за UTF-8 всегда). Столкнулся, как только включил некоторые свои файлы меню в гит.

DrKnS

2015-04-15 23:18

administrator   bugnote:0013636

4351.
Новое меню сохраняется в UTF-8.
Сохранённое в каком-нибудь более другом юникоде таким и останется.
Сохранённое не в юникоде при любом изменении пересохранится в UTF-8.

Issue History

Date Modified Username Field Change
2014-12-01 11:58 Maximus New Issue
2014-12-01 12:03 Maximus File Added: 0001-Implement-CachedWrite-WriteStr-considering-requested.patch
2014-12-01 12:03 Maximus File Added: 0002-Don-t-break-FarMenu.ini-s-codepage-saved-by-user.patch
2014-12-01 14:20 2useven10 Note Added: 0013292
2014-12-01 14:24 Maximus Note Added: 0013293
2014-12-01 14:51 DrKnS Assigned To => DrKnS
2014-12-01 14:51 DrKnS Status new => assigned
2014-12-01 15:58 vskirdin Note Added: 0013294
2015-04-15 18:03 NightRoman Note Added: 0013635
2015-04-15 23:18 DrKnS Note Added: 0013636
2015-04-15 23:18 DrKnS Status assigned => feedback
2015-07-08 23:32 DrKnS Build => 4351
2015-07-08 23:32 DrKnS Status feedback => closed
2015-07-08 23:32 DrKnS Resolution open => fixed
2015-07-08 23:32 DrKnS Fixed in Version => 3.0