X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/779288b48649bdc2afbea19ec886347187d6cee6..6aab927940dd5896e115e4ac9485a238ec4aeec3:/src/common/cmdline.cpp diff --git a/src/common/cmdline.cpp b/src/common/cmdline.cpp index c934ae4ae4..6f3b1860e5 100644 --- a/src/common/cmdline.cpp +++ b/src/common/cmdline.cpp @@ -111,6 +111,8 @@ struct wxCmdLineOption wxASSERT_MSG( type == typ, _T("type mismatch in wxCmdLineOption") ); } + double GetDoubleVal() const + { Check(wxCMD_LINE_VAL_DOUBLE); return m_doubleVal; } long GetLongVal() const { Check(wxCMD_LINE_VAL_NUMBER); return m_longVal; } const wxString& GetStrVal() const @@ -120,6 +122,8 @@ struct wxCmdLineOption { Check(wxCMD_LINE_VAL_DATE); return m_dateVal; } #endif // wxUSE_DATETIME + void SetDoubleVal(double val) + { Check(wxCMD_LINE_VAL_DOUBLE); m_doubleVal = val; m_hasVal = true; } void SetLongVal(long val) { Check(wxCMD_LINE_VAL_NUMBER); m_longVal = val; m_hasVal = true; } void SetStrVal(const wxString& val) @@ -143,6 +147,7 @@ public: private: bool m_hasVal; + double m_doubleVal; long m_longVal; wxString m_strVal; #if wxUSE_DATETIME @@ -510,6 +515,25 @@ bool wxCmdLineParser::Found(const wxString& name, long *value) const return true; } +bool wxCmdLineParser::Found(const wxString& name, double *value) const +{ + int i = m_data->FindOption(name); + if ( i == wxNOT_FOUND ) + i = m_data->FindOptionByLongName(name); + + wxCHECK_MSG( i != wxNOT_FOUND, false, _T("unknown option") ); + + wxCmdLineOption& opt = m_data->m_options[(size_t)i]; + if ( !opt.HasValue() ) + return false; + + wxCHECK_MSG( value, false, _T("NULL pointer in wxCmdLineOption::Found") ); + + *value = opt.GetDoubleVal(); + + return true; +} + #if wxUSE_DATETIME bool wxCmdLineParser::Found(const wxString& name, wxDateTime *value) const { @@ -802,6 +826,24 @@ int wxCmdLineParser::Parse(bool showUsage) } break; + case wxCMD_LINE_VAL_DOUBLE: + { + double val; + if ( value.ToDouble(&val) ) + { + opt.SetDoubleVal(val); + } + else + { + errorMsg << wxString::Format(_("'%s' is not a correct numeric value for option '%s'."), + value.c_str(), name.c_str()) + << _T('\n'); + + ok = false; + } + } + break; + #if wxUSE_DATETIME case wxCMD_LINE_VAL_DATE: { @@ -1132,6 +1174,10 @@ static wxString GetTypeName(wxCmdLineParamType type) s = _("num"); break; + case wxCMD_LINE_VAL_DOUBLE: + s = _("double"); + break; + case wxCMD_LINE_VAL_DATE: s = _("date"); break; @@ -1209,62 +1255,47 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxString& cmdline) bool isInsideQuotes = false; + const wxString::const_iterator end = cmdline.end(); wxString::const_iterator p = cmdline.begin(); for ( ;; ) { // skip white space - while ( p != cmdline.end() && (*p == _T(' ') || *p == _T('\t')) ) + while ( p != end && (*p == ' ' || *p == '\t') ) ++p; // anything left? - if ( p == cmdline.end() ) + if ( p == end ) break; // parse this parameter - bool endParam = false; bool lastBS = false; - for ( arg.clear(); !endParam; p++ ) + for ( arg.clear(); p != end; ++p ) { - switch ( (*p).GetValue() ) + const wxChar ch = *p; + if ( ch == '"' ) { - case _T('"'): - if ( !lastBS ) - { - isInsideQuotes = !isInsideQuotes; - - // don't put quote in arg - continue; - } - //else: quote has no special meaning but the backslash - // still remains -- makes no sense but this is what - // Windows does - break; - - case _T(' '): - case _T('\t'): - // backslash does *not* quote the space, only quotes do - if ( isInsideQuotes ) - { - // skip assignment below - break; - } - // fall through - - case _T('\0'): - endParam = true; + if ( !lastBS ) + { + isInsideQuotes = !isInsideQuotes; - break; + // don't put quote in arg + continue; + } + //else: quote has no special meaning but the backslash + // still remains -- makes no sense but this is what + // Windows does } - - if ( endParam ) + // note that backslash does *not* quote the space, only quotes do + else if ( !isInsideQuotes && (ch == ' ' || ch == '\t') ) { + ++p; // skip this space anyhow break; } - lastBS = *p == _T('\\'); + lastBS = ch == '\\'; - arg += *p; + arg += ch; } args.push_back(arg);