X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a18887b88e2ba064154ae5998db7b7533f6bb78..b9efe021b554fa3967d1442cf758435c5cd5ae8f:/src/common/encconv.cpp?ds=inline diff --git a/src/common/encconv.cpp b/src/common/encconv.cpp index dd7c28d520..ac467d90d8 100644 --- a/src/common/encconv.cpp +++ b/src/common/encconv.cpp @@ -18,8 +18,6 @@ #pragma hdrstop #endif -#if wxUSE_FONTMAP - #include "wx/encconv.h" #include @@ -106,7 +104,7 @@ static CharsetItem* BuildReverseTable(wxUint16 *tbl) CharsetItem *rev = new CharsetItem[128]; for (int i = 0; i < 128; i++) - rev[i].c = 128 + i, rev[i].u = tbl[i]; + rev[i].c = wxUint8(128 + i), rev[i].u = tbl[i]; qsort(rev, 128, sizeof(CharsetItem), CompareCharsetItems); @@ -146,8 +144,7 @@ bool wxEncodingConverter::Init(wxFontEncoding input_enc, wxFontEncoding output_e m_Table = new tchar[65536]; for (i = 0; i < 128; i++) m_Table[i] = (tchar)i; // 7bit ASCII - for (i = 128; i < 65536; i++) m_Table[i] = (tchar)'?'; - // FIXME - this should be character that means `unicode to charset' impossible, not '?' + for (i = 128; i < 65536; i++) m_Table[i] = (tchar)0; if (method == wxCONVERT_SUBSTITUTE) { @@ -207,8 +204,21 @@ bool wxEncodingConverter::Init(wxFontEncoding input_enc, wxFontEncoding output_e } +#define REPLACEMENT_CHAR ((tchar)'?') -void wxEncodingConverter::Convert(const char* input, char* output) const +inline tchar GetTableValue(const tchar *table, tchar value, bool& repl) +{ + tchar r = table[value]; + if (r == 0 && value != 0) + { + r = REPLACEMENT_CHAR; + repl = true; + } + return r; +} + + +bool wxEncodingConverter::Convert(const char* input, char* output) const { wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!")); wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!")); @@ -219,20 +229,25 @@ void wxEncodingConverter::Convert(const char* input, char* output) const if (m_JustCopy) { strcpy(output, input); - return; + return true; } - wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!")); + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + bool replaced = false; for (i = input, o = output; *i != 0;) - *(o++) = (char)(m_Table[(wxUint8)*(i++)]); + *(o++) = (char)(GetTableValue(m_Table, (wxUint8)*(i++), replaced)); *o = 0; + + return !replaced; } #if wxUSE_WCHAR_T -void wxEncodingConverter::Convert(const char* input, wchar_t* output) const +bool wxEncodingConverter::Convert(const char* input, wchar_t* output) const { wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!")); wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!")); @@ -245,19 +260,24 @@ void wxEncodingConverter::Convert(const char* input, wchar_t* output) const for (i = input, o = output; *i != 0;) *(o++) = (wchar_t)(*(i++)); *o = 0; - return; + return true; } - wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!")); + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + bool replaced = false; for (i = input, o = output; *i != 0;) - *(o++) = (wchar_t)(m_Table[(wxUint8)*(i++)]); + *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced)); *o = 0; + + return !replaced; } -void wxEncodingConverter::Convert(const wchar_t* input, char* output) const +bool wxEncodingConverter::Convert(const wchar_t* input, char* output) const { wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!")); wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!")); @@ -270,19 +290,24 @@ void wxEncodingConverter::Convert(const wchar_t* input, char* output) const for (i = input, o = output; *i != 0;) *(o++) = (char)(*(i++)); *o = 0; - return; + return true; } - wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!")); + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + + bool replaced = false; for (i = input, o = output; *i != 0;) - *(o++) = (char)(m_Table[(wxUint16)*(i++)]); + *(o++) = (char)(GetTableValue(m_Table, (wxUint16)*(i++), replaced)); *o = 0; + + return !replaced; } -void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const +bool wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const { wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!")); wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!")); @@ -296,14 +321,19 @@ void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const for (i = input, o = output; *i != 0;) *(o++) = (*(i++)); *o = 0; - return; + return true; } - wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!")); + wxCHECK_MSG(m_Table != NULL, false, + wxT("You must call wxEncodingConverter::Init() before actually converting!")); + bool replaced = false; + for (i = input, o = output; *i != 0;) - *(o++) = (wchar_t)(m_Table[(wxUint8)*(i++)]); + *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced)); *o = 0; + + return !replaced; } #endif // wxUSE_WCHAR_T @@ -498,4 +528,3 @@ wxFontEncodingArray wxEncodingConverter::GetAllEquivalents(wxFontEncoding enc) return arr; } -#endif // wxUSE_FONTMAP