From 02c92ad972ebc51001dddfd930e6811ab7901483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Tue, 16 Nov 2004 11:58:24 +0000 Subject: [PATCH] modified wxEncodingConverter API to report failures git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30562 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/encconv.tex | 18 +++++++---- include/wx/encconv.h | 12 +++---- src/common/encconv.cpp | 68 ++++++++++++++++++++++++++++----------- 3 files changed, 68 insertions(+), 30 deletions(-) diff --git a/docs/latex/wx/encconv.tex b/docs/latex/wx/encconv.tex index 75d3f757cc..312e47216a 100644 --- a/docs/latex/wx/encconv.tex +++ b/docs/latex/wx/encconv.tex @@ -94,25 +94,31 @@ on the text to convert in the other). \membersection{wxEncodingConverter::Convert}\label{wxencodingconverterconvert} -\constfunc{void}{Convert}{\param{const char* }{input}, \param{char* }{output}} +\constfunc{bool}{Convert}{\param{const char* }{input}, \param{char* }{output}} -\constfunc{void}{Convert}{\param{const wchar\_t* }{input}, \param{wchar\_t* }{output}} +\constfunc{bool}{Convert}{\param{const wchar\_t* }{input}, \param{wchar\_t* }{output}} -\constfunc{void}{Convert}{\param{const char* }{input}, \param{wchar\_t* }{output}} +\constfunc{bool}{Convert}{\param{const char* }{input}, \param{wchar\_t* }{output}} -\constfunc{void}{Convert}{\param{const wchar\_t* }{input}, \param{char* }{output}} +\constfunc{bool}{Convert}{\param{const wchar\_t* }{input}, \param{char* }{output}} Convert input string according to settings passed to \helpref{Init}{wxencodingconverterinit} and writes the result to {\it output}. -\constfunc{void}{Convert}{\param{char* }{str}} +\constfunc{bool}{Convert}{\param{char* }{str}} -\constfunc{void}{Convert}{\param{wchar\_t* }{str}} +\constfunc{bool}{Convert}{\param{wchar\_t* }{str}} Convert input string according to settings passed to \helpref{Init}{wxencodingconverterinit} in-place, i.e. write the result to the same memory area. +All of the versions above return \true if the conversion was lossless and +\false if at least one of the characters couldn't be converted and was replaced +with {\tt '?'} in the output. Note that if {\tt wxCONVERT\_SUBSTITUTE} was +passed to \helpref{Init}{wxencodingconverterinit}, substitution is considered +lossless operation. + \constfunc{wxString}{Convert}{\param{const wxString\& }{input}} Convert wxString and return new wxString object. diff --git a/include/wx/encconv.h b/include/wx/encconv.h index 3c6b65e89e..a4eecd05ec 100644 --- a/include/wx/encconv.h +++ b/include/wx/encconv.h @@ -93,15 +93,15 @@ class WXDLLIMPEXP_BASE wxEncodingConverter : public wxObject // Convert input string according to settings passed to Init. // Note that you must call Init before using Convert! - void Convert(const char* input, char* output) const; - void Convert(char* str) const { Convert(str, str); } + bool Convert(const char* input, char* output) const; + bool Convert(char* str) const { return Convert(str, str); } wxString Convert(const wxString& input) const; #if wxUSE_WCHAR_T - void Convert(const char* input, wchar_t* output) const; - void Convert(const wchar_t* input, char* output) const; - void Convert(const wchar_t* input, wchar_t* output) const; - void Convert(wchar_t* str) const { Convert(str, str); } + bool Convert(const char* input, wchar_t* output) const; + bool Convert(const wchar_t* input, char* output) const; + bool Convert(const wchar_t* input, wchar_t* output) const; + bool Convert(wchar_t* str) const { return Convert(str, str); } #endif // Return equivalent(s) for given font that are used // under given platform. wxPLATFORM_CURRENT means the plaform diff --git a/src/common/encconv.cpp b/src/common/encconv.cpp index 727de49016..f96e30896c 100644 --- a/src/common/encconv.cpp +++ b/src/common/encconv.cpp @@ -146,8 +146,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 +206,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 +231,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 +262,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 +292,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 +323,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