From 75717cb1214866a2afd70de513e56d8c7784122a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 6 Feb 2012 13:28:34 +0000 Subject: [PATCH] Fix handling of positional parameters in wxPrintf() and related. Handle positional parameter specifications in wxFormatConverter to ensure that e.g. "%N$s" are correctly transformed to "%N$S" if needed. This fixes the use of positional parameters under OS X. Closes #10965. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70523 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + src/common/strvararg.cpp | 13 +++++++++++++ tests/strings/strings.cpp | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/docs/changes.txt b/docs/changes.txt index 1fcd83c709..c4a224fb85 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -501,6 +501,7 @@ MSW: OSX: - Provide native implementations of wxDatePickerCtrl and wxTimePickerCtrl. +- Fix handling of positional parameters in wxPrintf() &c (David Connet). Univ: diff --git a/src/common/strvararg.cpp b/src/common/strvararg.cpp index a4c2256dfb..484fe0f883 100644 --- a/src/common/strvararg.cpp +++ b/src/common/strvararg.cpp @@ -161,6 +161,19 @@ public: { if ( CopyFmtChar(*format++) == wxT('%') ) { +#if wxUSE_PRINTF_POS_PARAMS + if ( *format >= '0' && *format <= '9' ) + { + SkipDigits(&format); + if ( *format == '$' ) + { + // It was a positional argument specification. + CopyFmtChar(*format++); + } + //else: it was a width specification, nothing else to do. + } +#endif // wxUSE_PRINTF_POS_PARAMS + // skip any flags while ( IsFlagChar(*format) ) CopyFmtChar(*format++); diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index 39e1904fd6..43e3640520 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -165,6 +165,13 @@ void StringTestCase::Format() wxString s(wxT('Z'), len); CPPUNIT_ASSERT_EQUAL( len, wxString::Format(wxT("%s"), s.c_str()).length()); } + + + CPPUNIT_ASSERT_EQUAL + ( + "two one", + wxString::Format(wxT("%2$s %1$s"), wxT("one"), wxT("two")) + ); } void StringTestCase::Constructors() -- 2.49.0