X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/541aa821800536b6e265d415de8c1ed9a304f1c1..57e2b887a0e798ab5ab2921cdeba550f322b000c:/include/wx/strvararg.h diff --git a/include/wx/strvararg.h b/include/wx/strvararg.h index ee87423fa7..8e40bd1ff1 100644 --- a/include/wx/strvararg.h +++ b/include/wx/strvararg.h @@ -47,6 +47,9 @@ class WXDLLIMPEXP_BASE wxString; // * wchar_t* if wxUSE_UNICODE_WCHAR or if wxUSE_UNICODE_UTF8 and the current // locale is not UTF-8 // +// Note that wxFormatString *must* be used for the format parameter of these +// functions, otherwise the implementation won't work correctly. +// // Parameters: // [ there are examples in square brackets showing values of the parameters // for the wxFprintf() wrapper for fprintf() function with the following @@ -111,11 +114,12 @@ class WXDLLIMPEXP_BASE wxString; // wxFormatString // ---------------------------------------------------------------------------- -// This class should be used for format string argument of the functions +// This class must be used for format string argument of the functions // defined using WX_DEFINE_VARARG_FUNC_* macros. It converts the string to // char* or wchar_t* for passing to implementation function efficiently (i.e. // without keeping the converted string in memory for longer than necessary, -// like c_str()) +// like c_str()). It also converts format string to the correct form that +// accounts for string changes done by wxArgNormalizer<> // // Note that this class can _only_ be used for function arguments! class WXDLLIMPEXP_BASE wxFormatString @@ -138,7 +142,13 @@ public: operator const char*() const { return wx_const_cast(wxFormatString*, this)->AsChar(); } private: + // InputAsChar() returns the value converted passed to ctor, only converted + // to char, while AsChar() takes the the string returned by InputAsChar() + // and does format string conversion on it as well (and similarly for + // ..AsWChar() below) + const char* InputAsChar(); const char* AsChar(); + wxCharBuffer m_convertedChar; #endif // !wxUSE_UNICODE_WCHAR #if wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY @@ -146,7 +156,9 @@ public: operator const wchar_t*() const { return wx_const_cast(wxFormatString*, this)->AsWChar(); } private: + const wchar_t* InputAsWChar(); const wchar_t* AsWChar(); + wxWCharBuffer m_convertedWChar; #endif // wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY private: @@ -433,28 +445,38 @@ WX_ARG_NORMALIZER_FORWARD(wxStdWideString, const wxStdWideString&); #if !wxUSE_UTF8_LOCALE_ONLY template<> struct wxArgNormalizerWchar - : public wxArgNormalizerWchar { - wxArgNormalizerWchar(const wxUniChar& s) - : wxArgNormalizerWchar((wxChar)s) {} + wxArgNormalizerWchar(const wxUniChar& s) : m_value(s) {} + + // FIXME-UTF8: use wchar_t once ANSI build is removed + wxChar get() const { return m_value; } + + wxChar m_value; }; #endif // !wxUSE_UTF8_LOCALE_ONLY #if wxUSE_UNICODE_UTF8 template<> struct wxArgNormalizerUtf8 - : public wxArgNormalizerUtf8 { - wxArgNormalizerUtf8(const wxUniChar& s) - // FIXME-UTF8: this is lossy, we need to convert to string, but that - // requires format string update - : wxArgNormalizerUtf8((const char)s) {} + wxArgNormalizerUtf8(const wxUniChar& s) : m_value(s.AsUTF8()) {} + + const wxStringCharType *get() const { return m_value; } + + wxUniChar::Utf8CharBuffer m_value; }; #endif // wxUSE_UNICODE_UTF8 WX_ARG_NORMALIZER_FORWARD(wxUniChar, const wxUniChar&); WX_ARG_NORMALIZER_FORWARD(const wxUniCharRef&, const wxUniChar&); WX_ARG_NORMALIZER_FORWARD(wxUniCharRef, const wxUniChar&); +// convert char/wchar_t to wxUniChar to get output in the right encoding: +WX_ARG_NORMALIZER_FORWARD(char, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(const char&, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(unsigned char, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(const unsigned char&, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(wchar_t, const wxUniChar&); +WX_ARG_NORMALIZER_FORWARD(const wchar_t&, const wxUniChar&); #undef WX_ARG_NORMALIZER_FORWARD