Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelfmz <fenix1905@tut.by>2022-11-05 20:31:53 +0300
committerGitHub <noreply@github.com>2022-11-05 20:31:53 +0300
commit253a6b140797e035eb9301a1632fed2408a837e2 (patch)
treeed6be316904b5d5ff11b7bfa46e7037fc2ec51d5 /far2l/src/base
parent89eaed71c674aadda536408638e3416bc7f4c053 (diff)
support full-width/composite characters and true color palette in terminal (#1386)
Added normal support for full-width (CJK etc) and composite (using diacritics) characters. IMPORTANT: WINPORT API changed in binary incompatible way in order to implement this.
Diffstat (limited to 'far2l/src/base')
-rw-r--r--far2l/src/base/FARString.cpp26
-rw-r--r--far2l/src/base/FARString.hpp6
2 files changed, 31 insertions, 1 deletions
diff --git a/far2l/src/base/FARString.cpp b/far2l/src/base/FARString.cpp
index d087ccb0..4a40327d 100644
--- a/far2l/src/base/FARString.cpp
+++ b/far2l/src/base/FARString.cpp
@@ -290,6 +290,16 @@ FARString& FARString::Append(const char *lpszAdd, UINT CodePage)
return *this;
}
+FARString& FARString::Append(wchar_t Ch, size_t Count)
+{
+ size_t nNewLength = m_pContent->GetLength() + Count;
+ PrepareForModify(nNewLength);
+ wmemset(m_pContent->GetData() + m_pContent->GetLength(), Ch, Count);
+ m_pContent->SetLength(nNewLength);
+
+ return *this;
+}
+
FARString& FARString::Copy(const FARString &Str)
{
auto prev_pContent = m_pContent;
@@ -549,3 +559,19 @@ std::string FARString::GetMB() const
Wide2MB(CPtr(), GetLength(), out);
return out;
}
+
+size_t FARString::CellsCount() const
+{
+ return StrCellsCount(CPtr(), GetLength());
+}
+
+size_t FARString::TruncateByCells(size_t nCount)
+{
+ size_t ng = CellsCount();
+ if (ng > nCount) {
+ size_t ng = nCount;
+ auto sz = StrSizeOfCells(CPtr(), GetLength(), ng, false);
+ Truncate(sz);
+ }
+ return ng;
+}
diff --git a/far2l/src/base/FARString.hpp b/far2l/src/base/FARString.hpp
index 93a26dd1..b19aabfd 100644
--- a/far2l/src/base/FARString.hpp
+++ b/far2l/src/base/FARString.hpp
@@ -141,6 +141,9 @@ public:
inline size_t GetLength() const { return m_pContent->GetLength(); }
size_t Truncate(size_t nLength);
+ size_t CellsCount() const;
+ size_t TruncateByCells(size_t nCount);
+
inline wchar_t At(size_t nIndex) const { return m_pContent->GetData()[nIndex]; }
inline bool IsEmpty() const { return !(m_pContent->GetLength() && *m_pContent->GetData()); }
@@ -160,7 +163,8 @@ public:
FARString& Append(const wchar_t* Str, size_t StrLen) { return Replace(GetLength(), 0, Str, StrLen); }
FARString& Append(const FARString& Str) { return Append(Str.CPtr(), Str.GetLength()); }
FARString& Append(const wchar_t* Str) { return Append(Str, StrLength(NullToEmpty(Str))); }
- FARString& Append(wchar_t Ch) { return Append(&Ch, 1); }
+ FARString& Append(wchar_t Ch, size_t Count);
+ FARString& Append(wchar_t Ch) { return Append(Ch, 1); }
FARString& Append(const char *lpszAdd, UINT CodePage=CP_UTF8);
FARString& Insert(size_t Pos, const wchar_t* Str, size_t StrLen) { return Replace(Pos, 0, Str, StrLen); }