Fix bug with parsing concatenated switches in wxCmdLineParser.

The constructs such as "-abcd" were not parsed correctly, i.e. the same as "-a
-b -c -d" because the code tried to parse a non-existent option "abcd" even if
it was supposed to not do this -- fix this.

Closes #11180.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61851 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2009-09-07 23:00:05 +00:00
parent 48284cc7c4
commit 758f356c53
3 changed files with 72 additions and 0 deletions

View File

@ -374,6 +374,7 @@ All:
- Fix output buffer overflow in wxBase64Decode() (Eric W. Savage).
- Added bilinear image resizing algorithm to wxImage (bishop).
- Fix bug with position argument in wxImage::Size() (Byron Sorgdrager).
- Fix bug with parsing concatenated switches in wxCmdLineParser (Mike Funduc).
All (GUI):

View File

@ -729,6 +729,10 @@ int wxCmdLineParser::Parse(bool showUsage)
m_data->m_arguments.insert
(m_data->m_arguments.begin() + n + 1, arg2);
count++;
// only leave the part which wasn't extracted into the
// next argument in this one
arg = arg.Left(len + 1);
}
//else: it's our value, we'll deal with it below
}

View File

@ -21,6 +21,8 @@
#endif // WX_PRECOMP
#include "wx/cmdline.h"
#include "wx/msgout.h"
#include "wx/scopeguard.h"
// --------------------------------------------------------------------------
// test class
@ -34,10 +36,12 @@ public:
private:
CPPUNIT_TEST_SUITE( CmdLineTestCase );
CPPUNIT_TEST( ConvertStringTestCase );
CPPUNIT_TEST( ParseSwitches );
CPPUNIT_TEST( Usage );
CPPUNIT_TEST_SUITE_END();
void ConvertStringTestCase();
void ParseSwitches();
void Usage();
DECLARE_NO_COPY_CLASS(CmdLineTestCase)
@ -117,6 +121,69 @@ void CmdLineTestCase::ConvertStringTestCase()
#undef WX_ASSERT_ARGS_EQUAL
}
void CmdLineTestCase::ParseSwitches()
{
// install a dummy message output object just suppress error messages from
// wxCmdLineParser::Parse()
class NoMessageOutput : public wxMessageOutput
{
public:
virtual void Output(const wxString& WXUNUSED(str)) { }
} noMessages;
wxMessageOutput * const old = wxMessageOutput::Set(&noMessages);
wxON_BLOCK_EXIT1( wxMessageOutput::Set, old );
wxCmdLineParser p;
p.AddSwitch("a");
p.AddSwitch("b");
p.AddSwitch("c");
p.AddSwitch("d");
p.SetCmdLine("");
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
CPPUNIT_ASSERT( !p.Found("a") );
p.SetCmdLine("-z");
CPPUNIT_ASSERT( p.Parse(false) != 0 );
p.SetCmdLine("-a");
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
CPPUNIT_ASSERT( p.Found("a") );
CPPUNIT_ASSERT( !p.Found("b") );
p.SetCmdLine("-a -d");
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
CPPUNIT_ASSERT( p.Found("a") );
CPPUNIT_ASSERT( !p.Found("b") );
CPPUNIT_ASSERT( !p.Found("c") );
CPPUNIT_ASSERT( p.Found("d") );
p.SetCmdLine("-abd");
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
CPPUNIT_ASSERT( p.Found("a") );
CPPUNIT_ASSERT( p.Found("b") );
CPPUNIT_ASSERT( !p.Found("c") );
CPPUNIT_ASSERT( p.Found("d") );
p.SetCmdLine("-abdz");
CPPUNIT_ASSERT( p.Parse(false) != 0 );
p.SetCmdLine("-ab -cd");
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
CPPUNIT_ASSERT( p.Found("a") );
CPPUNIT_ASSERT( p.Found("b") );
CPPUNIT_ASSERT( p.Found("c") );
CPPUNIT_ASSERT( p.Found("d") );
p.SetCmdLine("-da");
CPPUNIT_ASSERT_EQUAL(0, p.Parse(false) );
CPPUNIT_ASSERT( p.Found("a") );
CPPUNIT_ASSERT( !p.Found("b") );
CPPUNIT_ASSERT( !p.Found("c") );
CPPUNIT_ASSERT( p.Found("d") );
}
void CmdLineTestCase::Usage()
{
// check that Usage() returns roughly what we expect (don't check all the