]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cmdline.cpp
Correct weak ref usage which triggered an assert
[wxWidgets.git] / src / common / cmdline.cpp
index 45246ccb103b4d779bea8f80afc7f88538bbf601..6f3b1860e5c552707b74a9e39b7909cabdb25067 100644 (file)
@@ -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
@@ -193,6 +198,7 @@ struct wxCmdLineParserData
     void SetArguments(int argc, char **argv);
 #if wxUSE_UNICODE
     void SetArguments(int argc, wxChar **argv);
+    void SetArguments(int argc, const wxCmdLineArgsArray& argv);
 #endif // wxUSE_UNICODE
     void SetArguments(const wxString& cmdline);
 
@@ -240,6 +246,12 @@ void wxCmdLineParserData::SetArguments(int argc, wxChar **argv)
     }
 }
 
+void wxCmdLineParserData::SetArguments(int WXUNUSED(argc),
+                                       const wxCmdLineArgsArray& argv)
+{
+    m_arguments = argv.GetArguments();
+}
+
 #endif // wxUSE_UNICODE
 
 void wxCmdLineParserData::SetArguments(const wxString& cmdLine)
@@ -310,6 +322,11 @@ void wxCmdLineParser::SetCmdLine(int argc, wxChar **argv)
     m_data->SetArguments(argc, argv);
 }
 
+void wxCmdLineParser::SetCmdLine(int argc, const wxCmdLineArgsArray& argv)
+{
+    m_data->SetArguments(argc, argv);
+}
+
 #endif // wxUSE_UNICODE
 
 void wxCmdLineParser::SetCmdLine(const wxString& cmdline)
@@ -336,7 +353,7 @@ void wxCmdLineParser::EnableLongOptions(bool enable)
     m_data->m_enableLongOptions = enable;
 }
 
-bool wxCmdLineParser::AreLongOptionsEnabled()
+bool wxCmdLineParser::AreLongOptionsEnabled() const
 {
     return m_data->m_enableLongOptions;
 }
@@ -357,17 +374,20 @@ void wxCmdLineParser::SetDesc(const wxCmdLineEntryDesc *desc)
         switch ( desc->kind )
         {
             case wxCMD_LINE_SWITCH:
-                AddSwitch(desc->shortName, desc->longName, desc->description,
+                AddSwitch(desc->shortName, desc->longName,
+                          wxGetTranslation(desc->description),
                           desc->flags);
                 break;
 
             case wxCMD_LINE_OPTION:
-                AddOption(desc->shortName, desc->longName, desc->description,
+                AddOption(desc->shortName, desc->longName,
+                          wxGetTranslation(desc->description),
                           desc->type, desc->flags);
                 break;
 
             case wxCMD_LINE_PARAM:
-                AddParam(desc->description, desc->type, desc->flags);
+                AddParam(wxGetTranslation(desc->description),
+                         desc->type, desc->flags);
                 break;
 
             default:
@@ -495,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
 {
@@ -787,12 +826,29 @@ 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:
                             {
                                 wxDateTime dt;
-                                // FIXME-UTF8: ParseDate API will need changes
-                                const wxChar *res = dt.ParseDate(value.c_str());
+                                const char *res = dt.ParseDate(value);
                                 if ( !res || *res )
                                 {
                                     errorMsg << wxString::Format(_("Option '%s': '%s' cannot be converted to a date."),
@@ -931,7 +987,7 @@ int wxCmdLineParser::Parse(bool showUsage)
 // give the usage message
 // ----------------------------------------------------------------------------
 
-void wxCmdLineParser::Usage()
+void wxCmdLineParser::Usage() const
 {
     wxMessageOutput* msgOut = wxMessageOutput::Get();
     if ( msgOut )
@@ -944,7 +1000,7 @@ void wxCmdLineParser::Usage()
     }
 }
 
-wxString wxCmdLineParser::GetUsageString()
+wxString wxCmdLineParser::GetUsageString() const
 {
     wxString appname;
     if ( m_data->m_arguments.empty() )
@@ -1118,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;
@@ -1195,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);