diff --git a/contrib/include/wx/stc/stc.h b/contrib/include/wx/stc/stc.h index 1da2e8342c..72044be5af 100644 --- a/contrib/include/wx/stc/stc.h +++ b/contrib/include/wx/stc/stc.h @@ -3109,36 +3109,26 @@ typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&); // Utility functions used within wxSTC #ifndef SWIG +#if wxUSE_UNICODE + +wxString stc2wx(const char* str); +wxString stc2wx(const char* str, size_t len); +const wxWX2MBbuf wx2stc(const wxString& str); + +#else // not UNICODE inline wxString stc2wx(const char* str) { -#if wxUSE_UNICODE - return wxString(str, wxConvUTF8); -#else return wxString(str); -#endif } - -#if wxUSE_UNICODE -wxString stc2wx(const char* str, size_t len); -#else inline wxString stc2wx(const char* str, size_t len) { return wxString(str, len); } -#endif - - -#if wxUSE_UNICODE -inline const wxWX2MBbuf wx2stc(const wxString& str) { - return str.mb_str(wxConvUTF8); -} -#else inline const wxWX2MBbuf wx2stc(const wxString& str) { return str.mbc_str(); } -#endif - -#endif +#endif // UNICODE +#endif // SWIG //---------------------------------------------------------------------- #endif diff --git a/contrib/src/stc/PlatWX.cpp b/contrib/src/stc/PlatWX.cpp index 4b983f1cd6..ec10a85950 100644 --- a/contrib/src/stc/PlatWX.cpp +++ b/contrib/src/stc/PlatWX.cpp @@ -1249,25 +1249,47 @@ double ElapsedTime::Duration(bool reset) { //---------------------------------------------------------------------- #if wxUSE_UNICODE + +#include "UniConversion.h" + +// Convert using Scintilla's functions instead of wx's, Scintilla's are more +// forgiving and won't assert... + wxString stc2wx(const char* str, size_t len) { - // note: we assume that str is of length len not including the terminating null. - if (!len) return wxEmptyString; - else if (str[len-1] == 0) - // It's already terminated correctly. - return wxString(str, wxConvUTF8, len); - char *buffer=new char[len+1]; - strncpy(buffer, str, len); - buffer[len]=0; + size_t wclen = UCS2Length(str, len); + wxWCharBuffer buffer(wclen+1); - wxString cstr(buffer, wxConvUTF8, len); - - delete[] buffer; - return cstr; + size_t actualLen = UCS2FromUTF8(str, len, buffer.data(), wclen+1); + return wxString(buffer.data(), actualLen); } + + + +wxString stc2wx(const char* str) +{ + return stc2wx(str, strlen(str)); +} + + +const wxWX2MBbuf wx2stc(const wxString& str) +{ + const wchar_t* wcstr = str.c_str(); + size_t wclen = str.length(); + size_t len = UTF8Length(wcstr, wclen); + + wxCharBuffer buffer(len+1); + UTF8FromUCS2(wcstr, wclen, buffer.data(), len); + + // TODO check NULL termination!! + + + return buffer; +} + #endif diff --git a/contrib/src/stc/stc.h.in b/contrib/src/stc/stc.h.in index c74907d01f..e48912f1c4 100644 --- a/contrib/src/stc/stc.h.in +++ b/contrib/src/stc/stc.h.in @@ -463,36 +463,26 @@ typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&); // Utility functions used within wxSTC #ifndef SWIG +#if wxUSE_UNICODE + +wxString stc2wx(const char* str); +wxString stc2wx(const char* str, size_t len); +const wxWX2MBbuf wx2stc(const wxString& str); + +#else // not UNICODE inline wxString stc2wx(const char* str) { -#if wxUSE_UNICODE - return wxString(str, wxConvUTF8); -#else return wxString(str); -#endif } - -#if wxUSE_UNICODE -wxString stc2wx(const char* str, size_t len); -#else inline wxString stc2wx(const char* str, size_t len) { return wxString(str, len); } -#endif - - -#if wxUSE_UNICODE -inline const wxWX2MBbuf wx2stc(const wxString& str) { - return str.mb_str(wxConvUTF8); -} -#else inline const wxWX2MBbuf wx2stc(const wxString& str) { return str.mbc_str(); } -#endif - -#endif +#endif // UNICODE +#endif // SWIG //---------------------------------------------------------------------- #endif diff --git a/include/wx/stc/stc.h b/include/wx/stc/stc.h index 1da2e8342c..72044be5af 100644 --- a/include/wx/stc/stc.h +++ b/include/wx/stc/stc.h @@ -3109,36 +3109,26 @@ typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&); // Utility functions used within wxSTC #ifndef SWIG +#if wxUSE_UNICODE + +wxString stc2wx(const char* str); +wxString stc2wx(const char* str, size_t len); +const wxWX2MBbuf wx2stc(const wxString& str); + +#else // not UNICODE inline wxString stc2wx(const char* str) { -#if wxUSE_UNICODE - return wxString(str, wxConvUTF8); -#else return wxString(str); -#endif } - -#if wxUSE_UNICODE -wxString stc2wx(const char* str, size_t len); -#else inline wxString stc2wx(const char* str, size_t len) { return wxString(str, len); } -#endif - - -#if wxUSE_UNICODE -inline const wxWX2MBbuf wx2stc(const wxString& str) { - return str.mb_str(wxConvUTF8); -} -#else inline const wxWX2MBbuf wx2stc(const wxString& str) { return str.mbc_str(); } -#endif - -#endif +#endif // UNICODE +#endif // SWIG //---------------------------------------------------------------------- #endif diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 4b983f1cd6..ec10a85950 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -1249,25 +1249,47 @@ double ElapsedTime::Duration(bool reset) { //---------------------------------------------------------------------- #if wxUSE_UNICODE + +#include "UniConversion.h" + +// Convert using Scintilla's functions instead of wx's, Scintilla's are more +// forgiving and won't assert... + wxString stc2wx(const char* str, size_t len) { - // note: we assume that str is of length len not including the terminating null. - if (!len) return wxEmptyString; - else if (str[len-1] == 0) - // It's already terminated correctly. - return wxString(str, wxConvUTF8, len); - char *buffer=new char[len+1]; - strncpy(buffer, str, len); - buffer[len]=0; + size_t wclen = UCS2Length(str, len); + wxWCharBuffer buffer(wclen+1); - wxString cstr(buffer, wxConvUTF8, len); - - delete[] buffer; - return cstr; + size_t actualLen = UCS2FromUTF8(str, len, buffer.data(), wclen+1); + return wxString(buffer.data(), actualLen); } + + + +wxString stc2wx(const char* str) +{ + return stc2wx(str, strlen(str)); +} + + +const wxWX2MBbuf wx2stc(const wxString& str) +{ + const wchar_t* wcstr = str.c_str(); + size_t wclen = str.length(); + size_t len = UTF8Length(wcstr, wclen); + + wxCharBuffer buffer(len+1); + UTF8FromUCS2(wcstr, wclen, buffer.data(), len); + + // TODO check NULL termination!! + + + return buffer; +} + #endif diff --git a/src/stc/stc.h.in b/src/stc/stc.h.in index c74907d01f..e48912f1c4 100644 --- a/src/stc/stc.h.in +++ b/src/stc/stc.h.in @@ -463,36 +463,26 @@ typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&); // Utility functions used within wxSTC #ifndef SWIG +#if wxUSE_UNICODE + +wxString stc2wx(const char* str); +wxString stc2wx(const char* str, size_t len); +const wxWX2MBbuf wx2stc(const wxString& str); + +#else // not UNICODE inline wxString stc2wx(const char* str) { -#if wxUSE_UNICODE - return wxString(str, wxConvUTF8); -#else return wxString(str); -#endif } - -#if wxUSE_UNICODE -wxString stc2wx(const char* str, size_t len); -#else inline wxString stc2wx(const char* str, size_t len) { return wxString(str, len); } -#endif - - -#if wxUSE_UNICODE -inline const wxWX2MBbuf wx2stc(const wxString& str) { - return str.mb_str(wxConvUTF8); -} -#else inline const wxWX2MBbuf wx2stc(const wxString& str) { return str.mbc_str(); } -#endif - -#endif +#endif // UNICODE +#endif // SWIG //---------------------------------------------------------------------- #endif