]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cmdline.cpp
merged optimizations from 2.2
[wxWidgets.git] / src / common / cmdline.cpp
index 965d1143deb36f346267b1b27deb3a67f82a6e49..29399558f533abbbed8adb1523639cb5d3a9dd2d 100644 (file)
@@ -98,7 +98,7 @@ struct wxCmdLineOption
     void SetDateVal(const wxDateTime val)
         { Check(wxCMD_LINE_VAL_DATE); m_dateVal = val; m_hasVal = TRUE; }
 
-    void SetHasValue() { m_hasVal = TRUE; }
+    void SetHasValue(bool hasValue = TRUE) { m_hasVal = hasValue; }
     bool HasValue() const { return m_hasVal; }
 
 public:
@@ -190,12 +190,50 @@ void wxCmdLineParserData::SetArguments(int argc, char **argv)
     }
 }
 
-void wxCmdLineParserData::SetArguments(const wxString& WXUNUSED(cmdline))
+void wxCmdLineParserData::SetArguments(const wxString& cmdLine)
 {
-    // either use wxMSW wxApp::ConvertToStandardCommandArgs() or move its logic
-    // here and use this method from it - but don't duplicate the code
+    m_arguments.Empty();
+
+    m_arguments.Add(wxTheApp->GetAppName());
+
+    // Break up string
+    // Treat strings enclosed in double-quotes as single arguments
+    int i = 0;
+    int len = cmdLine.Length();
+    while (i < len)
+    {
+        // Skip whitespace
+        while ((i < len) && wxIsspace(cmdLine.GetChar(i)))
+            i ++;
 
-    wxFAIL_MSG(_T("TODO"));
+        if (i < len)
+        {
+            if (cmdLine.GetChar(i) == wxT('"')) // We found the start of a string
+            {
+                i ++;
+                int first = i;
+                while ((i < len) && (cmdLine.GetChar(i) != wxT('"')))
+                    i ++;
+
+                wxString arg(cmdLine.Mid(first, (i - first)));
+
+                m_arguments.Add(arg);
+
+                if (i < len)
+                    i ++; // Skip past 2nd quote
+            }
+            else // Unquoted argument
+            {
+                int first = i;
+                while ((i < len) && !wxIsspace(cmdLine.GetChar(i)))
+                    i ++;
+
+                wxString arg(cmdLine.Mid(first, (i - first)));
+
+                m_arguments.Add(arg);
+            }
+        }
+    }
 }
 
 int wxCmdLineParserData::FindOption(const wxString& name)
@@ -437,6 +475,18 @@ wxString wxCmdLineParser::GetParam(size_t n) const
     return m_data->m_parameters[n];
 }
 
+// Resets switches and options
+void wxCmdLineParser::Reset()
+{
+       unsigned int i;
+       for (i = 0; i < m_data->m_options.Count(); i++)
+       {
+               wxCmdLineOption& opt = m_data->m_options[(size_t)i];
+               opt.SetHasValue(FALSE);
+       }
+}
+
+
 // ----------------------------------------------------------------------------
 // the real work is done here
 // ----------------------------------------------------------------------------
@@ -452,6 +502,8 @@ int wxCmdLineParser::Parse()
 
     size_t countParam = m_data->m_paramDesc.GetCount();
 
+       Reset();
+
     // parse everything
     wxString arg;
     size_t count = m_data->m_arguments.GetCount();