diff options
author | elfmz <fenix1905@tut.by> | 2022-11-05 20:31:53 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-05 20:31:53 +0300 |
commit | 253a6b140797e035eb9301a1632fed2408a837e2 (patch) | |
tree | ed6be316904b5d5ff11b7bfa46e7037fc2ec51d5 /far2l/src/base | |
parent | 89eaed71c674aadda536408638e3416bc7f4c053 (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.cpp | 26 | ||||
-rw-r--r-- | far2l/src/base/FARString.hpp | 6 |
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); } |