X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0a4daf3980b9fdb9163ef02a076cc4973b5c2014..769c3372a2bd68c45d1a4afc8462d3b7939decb1:/src/common/cmdline.cpp diff --git a/src/common/cmdline.cpp b/src/common/cmdline.cpp index 0bfebc27b6..d32958fb93 100644 --- a/src/common/cmdline.cpp +++ b/src/common/cmdline.cpp @@ -37,6 +37,7 @@ #if wxUSE_CMDLINE_PARSER #include +#include // for LC_ALL #include "wx/datetime.h" #include "wx/msgout.h" @@ -106,6 +107,7 @@ struct wxCmdLineOption flags = fl; m_hasVal = false; + m_isNegated = false; } // can't use union easily here, so just store all possible data fields, we @@ -143,6 +145,9 @@ struct wxCmdLineOption void SetHasValue(bool hasValue = true) { m_hasVal = hasValue; } bool HasValue() const { return m_hasVal; } + void SetNegated() { m_isNegated = true; } + bool IsNegated() const { return m_isNegated; } + public: wxCmdLineEntryType kind; wxString shortName, @@ -153,6 +158,7 @@ public: private: bool m_hasVal; + bool m_isNegated; double m_doubleVal; long m_longVal; @@ -517,18 +523,23 @@ void wxCmdLineParser::AddUsageText(const wxString& text) // ---------------------------------------------------------------------------- bool wxCmdLineParser::Found(const wxString& name) const +{ + return FoundSwitch(name) != wxCMD_SWITCH_NOT_FOUND; +} + +wxCmdLineSwitchState wxCmdLineParser::FoundSwitch(const wxString& name) const { int i = m_data->FindOption(name); if ( i == wxNOT_FOUND ) i = m_data->FindOptionByLongName(name); - wxCHECK_MSG( i != wxNOT_FOUND, false, wxT("unknown switch") ); + wxCHECK_MSG( i != wxNOT_FOUND, wxCMD_SWITCH_NOT_FOUND, wxT("unknown switch") ); wxCmdLineOption& opt = m_data->m_options[(size_t)i]; if ( !opt.HasValue() ) - return false; + return wxCMD_SWITCH_NOT_FOUND; - return true; + return opt.IsNegated() ? wxCMD_SWITCH_OFF : wxCMD_SWITCH_ON; } bool wxCmdLineParser::Found(const wxString& name, wxString *value) const @@ -754,6 +765,14 @@ int wxCmdLineParser::Parse(bool showUsage) if ( m_data->m_options[(size_t)optInd].kind == wxCMD_LINE_SWITCH ) { + // if the switch is negatable and it is just followed + // by '-' the '-' is considered to be part of this + // switch + if ( (m_data->m_options[(size_t)optInd].flags & + wxCMD_LINE_SWITCH_NEGATABLE) && + arg[len] == '-' ) + ++len; + // pretend that all the rest of the argument is the // next argument, in fact wxString arg2 = arg[0u]; @@ -791,7 +810,10 @@ int wxCmdLineParser::Parse(bool showUsage) if ( opt.kind == wxCMD_LINE_SWITCH ) { // we must check that there is no value following the switch - if ( p != arg.end() ) + bool negated = (opt.flags & wxCMD_LINE_SWITCH_NEGATABLE) && + p != arg.end() && *p == '-'; + + if ( !negated && p != arg.end() ) { errorMsg << wxString::Format(_("Unexpected characters following option '%s'."), name.c_str()) << wxT('\n'); @@ -801,6 +823,8 @@ int wxCmdLineParser::Parse(bool showUsage) { // nothing more to do opt.SetHasValue(); + if ( negated ) + opt.SetNegated(); if ( opt.flags & wxCMD_LINE_OPTION_HELP ) { @@ -1094,7 +1118,7 @@ wxString wxCmdLineParser::GetUsageString() const for ( n = 0; n < count; n++ ) { wxCmdLineOption& opt = m_data->m_options[n]; - wxString option; + wxString option, negator; if ( opt.kind != wxCMD_LINE_USAGE_TEXT ) { @@ -1104,13 +1128,16 @@ wxString wxCmdLineParser::GetUsageString() const usage << wxT('['); } + if ( opt.flags & wxCMD_LINE_SWITCH_NEGATABLE ) + negator = wxT("[-]"); + if ( !opt.shortName.empty() ) { - usage << chSwitch << opt.shortName; + usage << chSwitch << opt.shortName << negator; } else if ( areLongOptionsEnabled && !opt.longName.empty() ) { - usage << wxT("--") << opt.longName; + usage << wxT("--") << opt.longName << negator; } else {