summaryrefslogtreecommitdiff
path: root/core/src/fxcrt
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/fxcrt')
-rw-r--r--core/src/fxcrt/fx_basic_bstring.cpp3
-rw-r--r--core/src/fxcrt/fx_basic_wstring.cpp118
2 files changed, 51 insertions, 70 deletions
diff --git a/core/src/fxcrt/fx_basic_bstring.cpp b/core/src/fxcrt/fx_basic_bstring.cpp
index 85e5041095..af06f0074b 100644
--- a/core/src/fxcrt/fx_basic_bstring.cpp
+++ b/core/src/fxcrt/fx_basic_bstring.cpp
@@ -920,8 +920,7 @@ CFX_ByteString CFX_ByteString::FromUnicode(const FX_WCHAR* str,
// static
CFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str) {
- CFX_CharMap* pCharMap = CFX_CharMap::GetDefaultMapper();
- return (*pCharMap->m_GetByteString)(pCharMap, str);
+ return CFX_CharMap::GetByteString(0, str);
}
int CFX_ByteString::Compare(const CFX_ByteStringC& str) const {
diff --git a/core/src/fxcrt/fx_basic_wstring.cpp b/core/src/fxcrt/fx_basic_wstring.cpp
index d83aa85213..8415e998a0 100644
--- a/core/src/fxcrt/fx_basic_wstring.cpp
+++ b/core/src/fxcrt/fx_basic_wstring.cpp
@@ -13,6 +13,24 @@
#include "core/include/fxcrt/fx_ext.h"
#include "third_party/base/numerics/safe_math.h"
+namespace {
+
+bool IsValidCodePage(FX_WORD codepage) {
+ switch (codepage) {
+ case 0:
+ case 932:
+ case 936:
+ case 949:
+ case 950:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+} // namespace
+
// static
CFX_WideString::StringData* CFX_WideString::StringData::Create(int nLen) {
// TODO(palmer): |nLen| should really be declared as |size_t|, or
@@ -349,8 +367,7 @@ CFX_WideString CFX_WideString::FromLocal(const CFX_ByteString& str) {
// static
CFX_WideString CFX_WideString::FromCodePage(const CFX_ByteString& str,
FX_WORD codepage) {
- CFX_CharMap* pCharMap = CFX_CharMap::GetDefaultMapper(codepage);
- return pCharMap->m_GetWideString(pCharMap, str);
+ return CFX_CharMap::GetWideString(codepage, str);
}
// static
@@ -997,71 +1014,36 @@ int CFX_WideString::GetInteger() const {
FX_FLOAT CFX_WideString::GetFloat() const {
return m_pData ? FX_wtof(m_pData->m_String, m_pData->m_nDataLength) : 0.0f;
}
-static CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap,
- const CFX_WideString& widestr) {
- int src_len = widestr.GetLength();
- int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
- int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr.c_str(),
- src_len, NULL, 0, NULL, NULL);
- if (dest_len == 0) {
- return CFX_ByteString();
- }
- CFX_ByteString bytestr;
- FX_CHAR* dest_buf = bytestr.GetBuffer(dest_len);
- FXSYS_WideCharToMultiByte(codepage, 0, widestr.c_str(), src_len, dest_buf,
- dest_len, NULL, NULL);
- bytestr.ReleaseBuffer(dest_len);
- return bytestr;
-}
-static CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap,
- const CFX_ByteString& bytestr) {
- int src_len = bytestr.GetLength();
- int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
+
+// static
+CFX_ByteString CFX_CharMap::GetByteString(FX_WORD codepage,
+ const CFX_WideString& wstr) {
+ FXSYS_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) {
+ FX_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(FX_WORD codepage,
+ const CFX_ByteString& bstr) {
+ FXSYS_assert(IsValidCodePage(codepage));
+ int src_len = bstr.GetLength();
int dest_len =
- FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL, 0);
- if (dest_len == 0) {
- return CFX_WideString();
- }
- CFX_WideString widestr;
- FX_WCHAR* dest_buf = widestr.GetBuffer(dest_len);
- FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len);
- widestr.ReleaseBuffer(dest_len);
- return widestr;
-}
-static int _DefMap_GetGBKCodePage() {
- return 936;
-}
-static int _DefMap_GetUHCCodePage() {
- return 949;
-}
-static int _DefMap_GetJISCodePage() {
- return 932;
-}
-static int _DefMap_GetBig5CodePage() {
- return 950;
-}
-static const CFX_CharMap g_DefaultMapper = {&_DefMap_GetWideString,
- &_DefMap_GetByteString, NULL};
-static const CFX_CharMap g_DefaultGBKMapper = {
- &_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetGBKCodePage};
-static const CFX_CharMap g_DefaultJISMapper = {
- &_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetJISCodePage};
-static const CFX_CharMap g_DefaultUHCMapper = {
- &_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetUHCCodePage};
-static const CFX_CharMap g_DefaultBig5Mapper = {
- &_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetBig5CodePage};
-CFX_CharMap* CFX_CharMap::GetDefaultMapper(int32_t codepage) {
- switch (codepage) {
- case 0:
- return (CFX_CharMap*)&g_DefaultMapper;
- case 932:
- return (CFX_CharMap*)&g_DefaultJISMapper;
- case 936:
- return (CFX_CharMap*)&g_DefaultGBKMapper;
- case 949:
- return (CFX_CharMap*)&g_DefaultUHCMapper;
- case 950:
- return (CFX_CharMap*)&g_DefaultBig5Mapper;
- }
- return NULL;
+ FXSYS_MultiByteToWideChar(codepage, 0, bstr, src_len, nullptr, 0);
+ CFX_WideString wstr;
+ if (dest_len) {
+ FX_WCHAR* dest_buf = wstr.GetBuffer(dest_len);
+ FXSYS_MultiByteToWideChar(codepage, 0, bstr, src_len, dest_buf, dest_len);
+ wstr.ReleaseBuffer(dest_len);
+ }
+ return wstr;
}