X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/93b79b6b57fdb427eecb8254af5bbb2831527041..971e47976f53665f5280d5538395cf7ac189a40e:/src/common/cmdline.cpp diff --git a/src/common/cmdline.cpp b/src/common/cmdline.cpp index 2248a5b746..12012e6807 100644 --- a/src/common/cmdline.cpp +++ b/src/common/cmdline.cpp @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "cmdline.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -38,13 +34,13 @@ #include "wx/intl.h" #include "wx/app.h" #include "wx/dynarray.h" - #include "wx/filefn.h" #endif //WX_PRECOMP #include #include "wx/datetime.h" #include "wx/msgout.h" +#include "wx/filename.h" // ---------------------------------------------------------------------------- // private functions @@ -86,7 +82,7 @@ struct wxCmdLineOption GetLongOptionName(lng).Len() == lng.Len(), wxT("Long option contains invalid characters") ); - + kind = k; @@ -97,7 +93,7 @@ struct wxCmdLineOption type = typ; flags = fl; - m_hasVal = FALSE; + m_hasVal = false; } // can't use union easily here, so just store all possible data fields, we @@ -120,15 +116,15 @@ struct wxCmdLineOption #endif // wxUSE_DATETIME void SetLongVal(long val) - { Check(wxCMD_LINE_VAL_NUMBER); m_longVal = val; m_hasVal = TRUE; } + { Check(wxCMD_LINE_VAL_NUMBER); m_longVal = val; m_hasVal = true; } void SetStrVal(const wxString& val) - { Check(wxCMD_LINE_VAL_STRING); m_strVal = val; m_hasVal = TRUE; } + { Check(wxCMD_LINE_VAL_STRING); m_strVal = val; m_hasVal = true; } #if wxUSE_DATETIME - void SetDateVal(const wxDateTime val) - { Check(wxCMD_LINE_VAL_DATE); m_dateVal = val; m_hasVal = TRUE; } + void SetDateVal(const wxDateTime& val) + { Check(wxCMD_LINE_VAL_DATE); m_dateVal = val; m_hasVal = true; } #endif // wxUSE_DATETIME - void SetHasValue(bool hasValue = TRUE) { m_hasVal = hasValue; } + void SetHasValue(bool hasValue = true) { m_hasVal = hasValue; } bool HasValue() const { return m_hasVal; } public: @@ -170,15 +166,15 @@ WX_DECLARE_OBJARRAY(wxCmdLineParam, wxArrayParams); #include "wx/arrimpl.cpp" -WX_DEFINE_OBJARRAY(wxArrayOptions); -WX_DEFINE_OBJARRAY(wxArrayParams); +WX_DEFINE_OBJARRAY(wxArrayOptions) +WX_DEFINE_OBJARRAY(wxArrayParams) // the parser internal state struct wxCmdLineParserData { // options wxString m_switchChars; // characters which may start an option - bool m_enableLongOptions; // TRUE if long options are enabled + bool m_enableLongOptions; // true if long options are enabled wxString m_logo; // some extra text to show in Usage() // cmd line data @@ -189,7 +185,10 @@ struct wxCmdLineParserData // methods wxCmdLineParserData(); + void SetArguments(int argc, char **argv); +#if wxUSE_UNICODE void SetArguments(int argc, wxChar **argv); +#endif // wxUSE_UNICODE void SetArguments(const wxString& cmdline); int FindOption(const wxString& name); @@ -206,7 +205,7 @@ struct wxCmdLineParserData wxCmdLineParserData::wxCmdLineParserData() { - m_enableLongOptions = TRUE; + m_enableLongOptions = true; #ifdef __UNIX_LIKE__ m_switchChars = _T("-"); #else // !Unix @@ -214,6 +213,18 @@ wxCmdLineParserData::wxCmdLineParserData() #endif } +void wxCmdLineParserData::SetArguments(int argc, char **argv) +{ + m_arguments.clear(); + + for ( int n = 0; n < argc; n++ ) + { + m_arguments.push_back(wxString::FromAscii(argv[n])); + } +} + +#if wxUSE_UNICODE + void wxCmdLineParserData::SetArguments(int argc, wxChar **argv) { m_arguments.clear(); @@ -224,11 +235,16 @@ void wxCmdLineParserData::SetArguments(int argc, wxChar **argv) } } +#endif // wxUSE_UNICODE + void wxCmdLineParserData::SetArguments(const wxString& cmdLine) { m_arguments.clear(); - m_arguments.push_back(wxTheApp->GetAppName()); + if(wxTheApp && wxTheApp->argc > 0) + m_arguments.push_back(wxTheApp->argv[0]); + else + m_arguments.push_back(wxEmptyString); wxArrayString args = wxCmdLineParser::ConvertStringToArgs(cmdLine); @@ -277,11 +293,20 @@ void wxCmdLineParser::Init() m_data = new wxCmdLineParserData; } +void wxCmdLineParser::SetCmdLine(int argc, char **argv) +{ + m_data->SetArguments(argc, argv); +} + +#if wxUSE_UNICODE + void wxCmdLineParser::SetCmdLine(int argc, wxChar **argv) { m_data->SetArguments(argc, argv); } +#endif // wxUSE_UNICODE + void wxCmdLineParser::SetCmdLine(const wxString& cmdline) { m_data->SetArguments(cmdline); @@ -418,13 +443,13 @@ bool wxCmdLineParser::Found(const wxString& name) const if ( i == wxNOT_FOUND ) i = m_data->FindOptionByLongName(name); - wxCHECK_MSG( i != wxNOT_FOUND, FALSE, _T("unknown switch") ); + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown switch") ); wxCmdLineOption& opt = m_data->m_options[(size_t)i]; if ( !opt.HasValue() ) - return FALSE; + return false; - return TRUE; + return true; } bool wxCmdLineParser::Found(const wxString& name, wxString *value) const @@ -433,17 +458,17 @@ bool wxCmdLineParser::Found(const wxString& name, wxString *value) const if ( i == wxNOT_FOUND ) i = m_data->FindOptionByLongName(name); - wxCHECK_MSG( i != wxNOT_FOUND, FALSE, _T("unknown option") ); + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown option") ); wxCmdLineOption& opt = m_data->m_options[(size_t)i]; if ( !opt.HasValue() ) - return FALSE; + return false; - wxCHECK_MSG( value, FALSE, _T("NULL pointer in wxCmdLineOption::Found") ); + wxCHECK_MSG( value, false, _T("NULL pointer in wxCmdLineOption::Found") ); *value = opt.GetStrVal(); - return TRUE; + return true; } bool wxCmdLineParser::Found(const wxString& name, long *value) const @@ -452,17 +477,17 @@ bool wxCmdLineParser::Found(const wxString& name, long *value) const if ( i == wxNOT_FOUND ) i = m_data->FindOptionByLongName(name); - wxCHECK_MSG( i != wxNOT_FOUND, FALSE, _T("unknown option") ); + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown option") ); wxCmdLineOption& opt = m_data->m_options[(size_t)i]; if ( !opt.HasValue() ) - return FALSE; + return false; - wxCHECK_MSG( value, FALSE, _T("NULL pointer in wxCmdLineOption::Found") ); + wxCHECK_MSG( value, false, _T("NULL pointer in wxCmdLineOption::Found") ); *value = opt.GetLongVal(); - return TRUE; + return true; } #if wxUSE_DATETIME @@ -472,17 +497,17 @@ bool wxCmdLineParser::Found(const wxString& name, wxDateTime *value) const if ( i == wxNOT_FOUND ) i = m_data->FindOptionByLongName(name); - wxCHECK_MSG( i != wxNOT_FOUND, FALSE, _T("unknown option") ); + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown option") ); wxCmdLineOption& opt = m_data->m_options[(size_t)i]; if ( !opt.HasValue() ) - return FALSE; + return false; - wxCHECK_MSG( value, FALSE, _T("NULL pointer in wxCmdLineOption::Found") ); + wxCHECK_MSG( value, false, _T("NULL pointer in wxCmdLineOption::Found") ); *value = opt.GetDateVal(); - return TRUE; + return true; } #endif // wxUSE_DATETIME @@ -504,7 +529,7 @@ void wxCmdLineParser::Reset() for ( size_t i = 0; i < m_data->m_options.Count(); i++ ) { wxCmdLineOption& opt = m_data->m_options[i]; - opt.SetHasValue(FALSE); + opt.SetHasValue(false); } } @@ -515,10 +540,10 @@ void wxCmdLineParser::Reset() int wxCmdLineParser::Parse(bool showUsage) { - bool maybeOption = TRUE; // can the following arg be an option? - bool ok = TRUE; // TRUE until an error is detected - bool helpRequested = FALSE; // TRUE if "-h" was given - bool hadRepeatableParam = FALSE; // TRUE if found param with MULTIPLE flag + bool maybeOption = true; // can the following arg be an option? + bool ok = true; // true until an error is detected + bool helpRequested = false; // true if "-h" was given + bool hadRepeatableParam = false; // true if found param with MULTIPLE flag size_t currentParam = 0; // the index in m_paramDesc @@ -539,7 +564,7 @@ int wxCmdLineParser::Parse(bool showUsage) // not like options (this is POSIX-like) if ( arg == _T("--") ) { - maybeOption = FALSE; + maybeOption = false; continue; } @@ -556,7 +581,7 @@ int wxCmdLineParser::Parse(bool showUsage) if ( arg[0u] == _T('-') && arg[1u] == _T('-') ) { // a long one - isLong = TRUE; + isLong = true; // Skip leading "--" const wxChar *p = arg.c_str() + 2; @@ -585,7 +610,7 @@ int wxCmdLineParser::Parse(bool showUsage) } else { - isLong = FALSE; + isLong = false; // a short one: as they can be cumulated, we try to find the // longest substring which is a valid option @@ -642,7 +667,7 @@ int wxCmdLineParser::Parse(bool showUsage) if ( optInd == wxNOT_FOUND ) { - ok = FALSE; + ok = false; continue; // will break, in fact } @@ -655,10 +680,10 @@ int wxCmdLineParser::Parse(bool showUsage) if ( opt.flags & wxCMD_LINE_OPTION_HELP ) { - helpRequested = TRUE; + helpRequested = true; // it's not an error, but we still stop here - ok = FALSE; + ok = false; } } else @@ -675,7 +700,7 @@ int wxCmdLineParser::Parse(bool showUsage) { errorMsg << wxString::Format(_("Option '%s' requires a value, '=' expected."), name.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } } else @@ -696,7 +721,7 @@ int wxCmdLineParser::Parse(bool showUsage) errorMsg << wxString::Format(_("Option '%s' requires a value."), name.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } else { @@ -713,7 +738,7 @@ int wxCmdLineParser::Parse(bool showUsage) errorMsg << wxString::Format(_("Separator expected after the option '%s'."), name.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } } } @@ -743,7 +768,7 @@ int wxCmdLineParser::Parse(bool showUsage) errorMsg << wxString::Format(_("'%s' is not a correct numeric value for option '%s'."), value.c_str(), name.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } } break; @@ -758,7 +783,7 @@ int wxCmdLineParser::Parse(bool showUsage) errorMsg << wxString::Format(_("Option '%s': '%s' cannot be converted to a date."), name.c_str(), value.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } else { @@ -792,14 +817,14 @@ int wxCmdLineParser::Parse(bool showUsage) _T("all parameters after the one with wxCMD_LINE_PARAM_MULTIPLE style are ignored") ); // remember that we did have this last repeatable parameter - hadRepeatableParam = TRUE; + hadRepeatableParam = true; } } else { errorMsg << wxString::Format(_("Unexpected parameter '%s'"), arg.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } } } @@ -836,7 +861,7 @@ int wxCmdLineParser::Parse(bool showUsage) errorMsg << wxString::Format(_("The value for the option '%s' must be specified."), optName.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } } @@ -857,7 +882,7 @@ int wxCmdLineParser::Parse(bool showUsage) errorMsg << wxString::Format(_("The required parameter '%s' was not specified."), param.description.c_str()) << wxT("\n"); - ok = FALSE; + ok = false; } } } @@ -903,14 +928,15 @@ void wxCmdLineParser::Usage() wxString wxCmdLineParser::GetUsageString() { - wxString appname = wxTheApp->GetAppName(); - if ( !appname ) + wxString appname; + if ( m_data->m_arguments.empty() ) { - wxCHECK_MSG( m_data->m_arguments.size() != 0, wxEmptyString, - _T("no program name") ); - - appname = wxFileNameFromPath(m_data->m_arguments[0]); - wxStripExtension(appname); + if ( wxTheApp ) + appname = wxTheApp->GetAppName(); + } + else // use argv[0] + { + appname = wxFileName(m_data->m_arguments[0]).GetName(); } // we construct the brief cmd line desc on the fly, but not the detailed @@ -1177,10 +1203,14 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p) // fall through case _T('\0'): - endParam = TRUE; + endParam = true; - // exit from the loop directly, without changing arg - continue; + break; + } + + if ( endParam ) + { + break; } lastBS = *p == _T('\\'); @@ -1193,4 +1223,3 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p) return args; } -