From 4a7f0351fc047bdd04f7aae6bd5cb7139e47e496 Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Wed, 18 Feb 2009 15:49:09 +0000 Subject: [PATCH] always NUL-terminate the m_szFlags buffer; add test for %*s case git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@58994 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/wxchar.cpp | 12 +++++++++--- tests/strings/vsnprintf.cpp | 9 +++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/common/wxchar.cpp b/src/common/wxchar.cpp index d1ab3cf838..bce9d5c2a4 100644 --- a/src/common/wxchar.cpp +++ b/src/common/wxchar.cpp @@ -565,6 +565,8 @@ bool wxPrintfConvSpec::Parse(const wxChar *format) break; case wxT('c'): + m_szFlags[flagofs++] = char(ch); + m_szFlags[flagofs] = '\0'; if (ilen == -1) { // in Unicode mode %hc == ANSI character @@ -591,6 +593,8 @@ bool wxPrintfConvSpec::Parse(const wxChar *format) break; case wxT('s'): + m_szFlags[flagofs++] = char(ch); + m_szFlags[flagofs] = '\0'; if (ilen == -1) { // Unicode mode wx extension: we'll let %hs mean non-Unicode @@ -615,6 +619,8 @@ bool wxPrintfConvSpec::Parse(const wxChar *format) break; case wxT('n'): + m_szFlags[flagofs++] = char(ch); + m_szFlags[flagofs] = '\0'; if (ilen == 0) m_type = wxPAT_NINT; else if (ilen == -1) @@ -671,7 +677,7 @@ void wxPrintfConvSpec::ReplaceAsteriskWith(int width) bool wxPrintfConvSpec::LoadArg(wxPrintfArg *p, va_list &argptr) { - // did the '*' width/precision specifier was used ? + // was the '*' width/precision specifier used ? if (m_nMaxWidth == -1) { // take the maxwidth specifier from the stack @@ -1191,7 +1197,7 @@ int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax, // NOTE2: the +1 is because we want to copy also the '\0' size_t tocopy = wxStrlen(format) + 1 - ( toparse - format ) ; - lenCur += wxCopyStrWithPercents(lenMax - lenCur, buf + lenCur, + lenCur += wxCopyStrWithPercents(lenMax - lenCur, buf + lenCur, tocopy, toparse) - 1; if (buf[lenCur]) { @@ -1256,7 +1262,7 @@ int WXDLLEXPORT wxSnprintf_(wxChar *buf, size_t len, const wxChar *format, ...) int wxSprintf (wchar_t * s, const wchar_t * format, ... ) { va_list arglist; - + va_start( arglist, format ); int iLen = swprintf ( s, -1, format, arglist ); va_end( arglist ); diff --git a/tests/strings/vsnprintf.cpp b/tests/strings/vsnprintf.cpp index 7e042ab87b..3f3ab52d36 100644 --- a/tests/strings/vsnprintf.cpp +++ b/tests/strings/vsnprintf.cpp @@ -40,6 +40,11 @@ int r; #define ASSERT_STR_EQUAL( a, b ) \ CPPUNIT_ASSERT_EQUAL( wxString(a), wxString(b) ); +#define CMP6(expected, x, y, z, w, t) \ + r=wxSnprintf(buf, MAX_TEST_LEN, wxT(x), y, z, w, t); \ + CPPUNIT_ASSERT( r > 0 ); \ + ASSERT_STR_EQUAL( wxT(expected), buf ); + #define CMP5(expected, x, y, z, w) \ r=wxSnprintf(buf, MAX_TEST_LEN, wxT(x), y, z, w); \ CPPUNIT_ASSERT( r > 0 ); \ @@ -290,6 +295,10 @@ void VsnprintfTestCase::Asterisk() CMP5("0.1", "%*.*f", 3, 1, 0.123); CMP4("%0.002", "%%%.*f", 3, 0.0023456789); + + CMP4(" a", "%*c", 8, 'a'); + CMP4(" four", "%*s", 8, "four"); + CMP6(" four four", "%*s %*s", 8, "four", 6, "four"); } void VsnprintfTestCase::Percent()