diff --git a/docs/changes.txt b/docs/changes.txt index 0beea8ce8a..2aa5da4f36 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -32,6 +32,7 @@ Changes in behaviour which may result in build errors All: +- Add "%z" support to printf()-like functions like wxString::Format() (RIVDSL). - Add wxPowerResourceBlocker (Tobias Taschner). - Add wxApp::StoreCurrentException() and RethrowStoredException() and implement their functionality by default when using C++11 compiler. diff --git a/src/common/strvararg.cpp b/src/common/strvararg.cpp index aa698a58b3..0196e06ee9 100644 --- a/src/common/strvararg.cpp +++ b/src/common/strvararg.cpp @@ -198,6 +198,17 @@ public: switch ( *format ) { +#ifdef __VISUALC__ + case 'z': + // Used for size_t printing (e.g. %zu) and is in C99, + // but is not portable, MSVC uses 'I' with the same + // meaning. + ChangeFmtChar('I'); + format++; + size = Size_Default; + break; +#endif // __VISUALC__ + case 'h': size = Size_Short; format++; @@ -341,6 +352,18 @@ private: *(m_fmtLast++) = ch; } + // change a character + void ChangeFmtChar(CharType ch) + { + if ( m_fmtOrig ) + { + // so far we haven't translated anything yet + CopyAllBefore(); + } + + *m_fmtLast = ch; + } + void CopyAllBefore() { wxASSERT_MSG( m_fmtOrig && m_fmt.data() == NULL, "logic error" ); diff --git a/tests/strings/vararg.cpp b/tests/strings/vararg.cpp index b733516874..cc5d4d51c4 100644 --- a/tests/strings/vararg.cpp +++ b/tests/strings/vararg.cpp @@ -36,6 +36,7 @@ private: CPPUNIT_TEST_SUITE( VarArgTestCase ); CPPUNIT_TEST( StringPrintf ); CPPUNIT_TEST( CharPrintf ); + CPPUNIT_TEST( SizetPrintf ); #if wxUSE_STD_STRING CPPUNIT_TEST( StdString ); #endif @@ -49,6 +50,7 @@ private: void StringPrintf(); void CharPrintf(); + void SizetPrintf(); #if wxUSE_STD_STRING void StdString(); #endif @@ -138,6 +140,24 @@ void VarArgTestCase::CharPrintf() CPPUNIT_ASSERT_EQUAL( "value is 240 (int)", s ); } +void VarArgTestCase::SizetPrintf() +{ + size_t i = 1; + ssize_t j = -2; + + CPPUNIT_ASSERT_EQUAL + ( + "size_t=1 ssize_t=-2", + wxString::Format("size_t=%zu ssize_t=%zd", i, j) + ); + + CPPUNIT_ASSERT_EQUAL + ( + "size_t=0xA0", + wxString::Format("size_t=0x%zX", static_cast(160)) + ); +} + #if wxUSE_STD_STRING void VarArgTestCase::StdString() {