diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/fxcrt/cfx_bytestring.cpp | 36 | ||||
-rw-r--r-- | core/fxcrt/cfx_widestring.cpp | 86 | ||||
-rw-r--r-- | core/fxcrt/fx_basic.h | 23 |
3 files changed, 71 insertions, 74 deletions
diff --git a/core/fxcrt/cfx_bytestring.cpp b/core/fxcrt/cfx_bytestring.cpp index 5c534507c6..f0dc370cc9 100644 --- a/core/fxcrt/cfx_bytestring.cpp +++ b/core/fxcrt/cfx_bytestring.cpp @@ -12,7 +12,7 @@ #include <cctype> #include "core/fxcrt/cfx_string_pool_template.h" -#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_codepage.h" #include "core/fxcrt/fx_extension.h" #include "core/fxcrt/fx_safe_types.h" #include "third_party/base/numerics/safe_math.h" @@ -82,6 +82,38 @@ const char* FX_strstr(const char* haystack, return nullptr; } +#ifndef NDEBUG +bool IsValidCodePage(uint16_t codepage) { + switch (codepage) { + case FX_CODEPAGE_DefANSI: + case FX_CODEPAGE_ShiftJIS: + case FX_CODEPAGE_ChineseSimplified: + case FX_CODEPAGE_Hangul: + case FX_CODEPAGE_ChineseTraditional: + return true; + default: + return false; + } +} +#endif + +CFX_ByteString GetByteString(uint16_t codepage, const CFX_WideStringC& wstr) { + ASSERT(IsValidCodePage(codepage)); + + int src_len = wstr.GetLength(); + int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len, + nullptr, 0, nullptr, nullptr); + if (!dest_len) + return CFX_ByteString(); + + CFX_ByteString bstr; + char* dest_buf = bstr.GetBuffer(dest_len); + FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len, dest_buf, + dest_len, nullptr, nullptr); + bstr.ReleaseBuffer(dest_len); + return bstr; +} + } // namespace static_assert(sizeof(CFX_ByteString) <= sizeof(char*), @@ -685,7 +717,7 @@ CFX_ByteString CFX_ByteString::FromUnicode(const wchar_t* str, FX_STRSIZE len) { // static CFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str) { - return CFX_CharMap::GetByteString(0, str.AsStringC()); + return GetByteString(0, str.AsStringC()); } int CFX_ByteString::Compare(const CFX_ByteStringC& str) const { diff --git a/core/fxcrt/cfx_widestring.cpp b/core/fxcrt/cfx_widestring.cpp index 8cd4de6edd..08f41681a4 100644 --- a/core/fxcrt/cfx_widestring.cpp +++ b/core/fxcrt/cfx_widestring.cpp @@ -13,7 +13,7 @@ #include <cwctype> #include "core/fxcrt/cfx_string_pool_template.h" -#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_codepage.h" #include "core/fxcrt/fx_extension.h" #include "core/fxcrt/fx_safe_types.h" #include "third_party/base/numerics/safe_math.h" @@ -30,22 +30,6 @@ template struct std::hash<CFX_WideString>; namespace { -#ifndef NDEBUG -bool IsValidCodePage(uint16_t codepage) { - switch (codepage) { - case 0: - case 932: - case 936: - case 949: - case 950: - return true; - - default: - return false; - } -} -#endif - const wchar_t* FX_wcsstr(const wchar_t* haystack, int haystack_len, const wchar_t* needle, @@ -260,6 +244,38 @@ FX_STRSIZE GuessSizeForVSWPrintf(const wchar_t* pFormat, va_list argList) { return nMaxLen; } +#ifndef NDEBUG +bool IsValidCodePage(uint16_t codepage) { + switch (codepage) { + case FX_CODEPAGE_DefANSI: + case FX_CODEPAGE_ShiftJIS: + case FX_CODEPAGE_ChineseSimplified: + case FX_CODEPAGE_Hangul: + case FX_CODEPAGE_ChineseTraditional: + return true; + default: + return false; + } +} +#endif + +CFX_WideString GetWideString(uint16_t codepage, const CFX_ByteStringC& bstr) { + ASSERT(IsValidCodePage(codepage)); + + int src_len = bstr.GetLength(); + int dest_len = + FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, nullptr, 0); + if (!dest_len) + return CFX_WideString(); + + CFX_WideString wstr; + wchar_t* dest_buf = wstr.GetBuffer(dest_len); + FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, dest_buf, + dest_len); + wstr.ReleaseBuffer(dest_len); + return wstr; +} + } // namespace static_assert(sizeof(CFX_WideString) <= sizeof(wchar_t*), @@ -849,7 +865,7 @@ CFX_WideString CFX_WideString::FromLocal(const CFX_ByteStringC& str) { // static CFX_WideString CFX_WideString::FromCodePage(const CFX_ByteStringC& str, uint16_t codepage) { - return CFX_CharMap::GetWideString(codepage, str); + return GetWideString(codepage, str); } // static @@ -1033,37 +1049,3 @@ int CFX_WideString::GetInteger() const { float CFX_WideString::GetFloat() const { return m_pData ? FX_wtof(m_pData->m_String, m_pData->m_nDataLength) : 0.0f; } - -// static -CFX_ByteString CFX_CharMap::GetByteString(uint16_t codepage, - const CFX_WideStringC& wstr) { - ASSERT(IsValidCodePage(codepage)); - int src_len = wstr.GetLength(); - int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len, - nullptr, 0, nullptr, nullptr); - CFX_ByteString bstr; - if (dest_len) { - char* dest_buf = bstr.GetBuffer(dest_len); - FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len, dest_buf, - dest_len, nullptr, nullptr); - bstr.ReleaseBuffer(dest_len); - } - return bstr; -} - -// static -CFX_WideString CFX_CharMap::GetWideString(uint16_t codepage, - const CFX_ByteStringC& bstr) { - ASSERT(IsValidCodePage(codepage)); - int src_len = bstr.GetLength(); - int dest_len = - FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, nullptr, 0); - CFX_WideString wstr; - if (dest_len) { - wchar_t* dest_buf = wstr.GetBuffer(dest_len); - FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, dest_buf, - dest_len); - wstr.ReleaseBuffer(dest_len); - } - return wstr; -} diff --git a/core/fxcrt/fx_basic.h b/core/fxcrt/fx_basic.h index ed2f579579..8669c66f5e 100644 --- a/core/fxcrt/fx_basic.h +++ b/core/fxcrt/fx_basic.h @@ -131,36 +131,19 @@ class CFX_FileBufferArchive { CFX_RetainPtr<IFX_WriteStream> m_pFile; }; -class CFX_CharMap { - public: - static CFX_ByteString GetByteString(uint16_t codepage, - const CFX_WideStringC& wstr); - - static CFX_WideString GetWideString(uint16_t codepage, - const CFX_ByteStringC& bstr); - - CFX_CharMap() = delete; -}; - class CFX_UTF8Decoder { public: CFX_UTF8Decoder() { m_PendingBytes = 0; } void Clear(); - void Input(uint8_t byte); - void AppendChar(uint32_t ch); - void ClearStatus() { m_PendingBytes = 0; } - CFX_WideStringC GetResult() const { return m_Buffer.AsStringC(); } - protected: + private: int m_PendingBytes; - uint32_t m_PendingChar; - CFX_WideTextBuf m_Buffer; }; @@ -172,7 +155,7 @@ class CFX_UTF8Encoder { void AppendStr(const CFX_ByteStringC& str) { m_Buffer << str; } CFX_ByteStringC GetResult() const { return m_Buffer.AsStringC(); } - protected: + private: CFX_ByteTextBuf m_Buffer; }; @@ -207,7 +190,7 @@ class CFX_BitStream { return m_BitSize >= m_BitPos ? m_BitSize - m_BitPos : 0; } - protected: + private: uint32_t m_BitPos; uint32_t m_BitSize; const uint8_t* m_pData; |