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:
parent
48284cc7c4
commit
758f356c53
@ -374,6 +374,7 @@ All:
|
|||||||
- Fix output buffer overflow in wxBase64Decode() (Eric W. Savage).
|
- Fix output buffer overflow in wxBase64Decode() (Eric W. Savage).
|
||||||
- Added bilinear image resizing algorithm to wxImage (bishop).
|
- Added bilinear image resizing algorithm to wxImage (bishop).
|
||||||
- Fix bug with position argument in wxImage::Size() (Byron Sorgdrager).
|
- Fix bug with position argument in wxImage::Size() (Byron Sorgdrager).
|
||||||
|
- Fix bug with parsing concatenated switches in wxCmdLineParser (Mike Funduc).
|
||||||
|
|
||||||
All (GUI):
|
All (GUI):
|
||||||
|
|
||||||
|
@ -729,6 +729,10 @@ int wxCmdLineParser::Parse(bool showUsage)
|
|||||||
m_data->m_arguments.insert
|
m_data->m_arguments.insert
|
||||||
(m_data->m_arguments.begin() + n + 1, arg2);
|
(m_data->m_arguments.begin() + n + 1, arg2);
|
||||||
count++;
|
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
|
//else: it's our value, we'll deal with it below
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#endif // WX_PRECOMP
|
#endif // WX_PRECOMP
|
||||||
|
|
||||||
#include "wx/cmdline.h"
|
#include "wx/cmdline.h"
|
||||||
|
#include "wx/msgout.h"
|
||||||
|
#include "wx/scopeguard.h"
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// test class
|
// test class
|
||||||
@ -34,10 +36,12 @@ public:
|
|||||||
private:
|
private:
|
||||||
CPPUNIT_TEST_SUITE( CmdLineTestCase );
|
CPPUNIT_TEST_SUITE( CmdLineTestCase );
|
||||||
CPPUNIT_TEST( ConvertStringTestCase );
|
CPPUNIT_TEST( ConvertStringTestCase );
|
||||||
|
CPPUNIT_TEST( ParseSwitches );
|
||||||
CPPUNIT_TEST( Usage );
|
CPPUNIT_TEST( Usage );
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
void ConvertStringTestCase();
|
void ConvertStringTestCase();
|
||||||
|
void ParseSwitches();
|
||||||
void Usage();
|
void Usage();
|
||||||
|
|
||||||
DECLARE_NO_COPY_CLASS(CmdLineTestCase)
|
DECLARE_NO_COPY_CLASS(CmdLineTestCase)
|
||||||
@ -117,6 +121,69 @@ void CmdLineTestCase::ConvertStringTestCase()
|
|||||||
#undef WX_ASSERT_ARGS_EQUAL
|
#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()
|
void CmdLineTestCase::Usage()
|
||||||
{
|
{
|
||||||
// check that Usage() returns roughly what we expect (don't check all the
|
// check that Usage() returns roughly what we expect (don't check all the
|
||||||
|
Loading…
Reference in New Issue
Block a user