]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cmdline.cpp
made wxRTTI macros namespace-friendly (patch 799434)
[wxWidgets.git] / src / common / cmdline.cpp
index 87c1c8ecee52899dce8c4bbe4452de1c7a23a4be..871cf5dbf28435cf0c245b43cf78b287eedb4f64 100644 (file)
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "cmdline.h"
 #endif
 
@@ -216,19 +216,19 @@ wxCmdLineParserData::wxCmdLineParserData()
 
 void wxCmdLineParserData::SetArguments(int argc, wxChar **argv)
 {
-    m_arguments.Empty();
+    m_arguments.clear();
 
     for ( int n = 0; n < argc; n++ )
     {
-        m_arguments.Add(argv[n]);
+        m_arguments.push_back(argv[n]);
     }
 }
 
 void wxCmdLineParserData::SetArguments(const wxString& cmdLine)
 {
-    m_arguments.Empty();
+    m_arguments.clear();
 
-    m_arguments.Add(wxTheApp->GetAppName());
+    m_arguments.push_back(wxTheApp->GetAppName());
 
     wxArrayString args = wxCmdLineParser::ConvertStringToArgs(cmdLine);
 
@@ -488,7 +488,7 @@ bool wxCmdLineParser::Found(const wxString& name, wxDateTime *value) const
 
 size_t wxCmdLineParser::GetParamCount() const
 {
-    return m_data->m_parameters.GetCount();
+    return m_data->m_parameters.size();
 }
 
 wxString wxCmdLineParser::GetParam(size_t n) const
@@ -529,7 +529,7 @@ int wxCmdLineParser::Parse(bool showUsage)
 
     // parse everything
     wxString arg;
-    size_t count = m_data->m_arguments.GetCount();
+    size_t count = m_data->m_arguments.size();
     for ( size_t n = 1; ok && (n < count); n++ )    // 0 is program name
     {
         arg = m_data->m_arguments[n];
@@ -632,7 +632,8 @@ int wxCmdLineParser::Parse(bool showUsage)
                         wxString arg2 = arg[0u];
                         arg2 += arg.Mid(len + 1); // +1 for leading '-'
 
-                        m_data->m_arguments.Insert(arg2, n + 1);
+                        m_data->m_arguments.insert
+                            (m_data->m_arguments.begin() + n + 1, arg2);
                         count++;
                     }
                     //else: it's our value, we'll deal with it below
@@ -779,7 +780,7 @@ int wxCmdLineParser::Parse(bool showUsage)
 
                 // TODO check the param type
 
-                m_data->m_parameters.Add(arg);
+                m_data->m_parameters.push_back(arg);
 
                 if ( !(param.flags & wxCMD_LINE_PARAM_MULTIPLE) )
                 {
@@ -905,7 +906,7 @@ wxString wxCmdLineParser::GetUsageString()
     wxString appname = wxTheApp->GetAppName();
     if ( !appname )
     {
-        wxCHECK_MSG( !m_data->m_arguments.IsEmpty(), wxEmptyString,
+        wxCHECK_MSG( m_data->m_arguments.size() != 0, wxEmptyString,
                      _T("no program name") );
 
         appname = wxFileNameFromPath(m_data->m_arguments[0]);
@@ -989,8 +990,8 @@ wxString wxCmdLineParser::GetUsageString()
             usage << _T(']');
         }
 
-        namesOptions.Add(option);
-        descOptions.Add(opt.description);
+        namesOptions.push_back(option);
+        descOptions.push_back(opt.description);
     }
 
     count = m_data->m_paramDesc.GetCount();
@@ -1021,7 +1022,7 @@ wxString wxCmdLineParser::GetUsageString()
 
     // now construct the detailed help message
     size_t len, lenMax = 0;
-    count = namesOptions.GetCount();
+    count = namesOptions.size();
     for ( n = 0; n < count; n++ )
     {
         len = namesOptions[n].length();
@@ -1120,24 +1121,10 @@ static wxString GetLongOptionName(const wxChar *p)
 
 /*
    This function is mainly used under Windows (as under Unix we always get the
-   command line arguments as argc/argv anyhow) and so it tries to handle the
-   Windows path names (separated by backslashes) correctly. For this it only
-   considers that a backslash may be used to escape another backslash (but
-   normally this is _not_ needed) or a quote but nothing else.
-
-   In particular, to pass a single argument containing a space to the program
-   it should be quoted:
-
-   myprog.exe foo bar       -> argc = 3, argv[1] = "foo", argv[2] = "bar"
-   myprog.exe "foo bar"     -> argc = 2, argv[1] = "foo bar"
-
-   To pass an argument containing spaces and quotes, the latter should be
-   escaped with a backslash:
-
-   myprog.exe "foo \"bar\"" -> argc = 2, argv[1] = "foo "bar""
-
-   This hopefully matches the conventions used by Explorer/command line
-   interpreter under Windows. If not, this function should be fixed.
+   command line arguments as argc/argv anyhow) and so it tries to follow
+   Windows conventions for the command line handling, not Unix ones. For
+   instance, backslash is not special except when it precedes double quote when
+   it does quote it.
  */
 
 /* static */
@@ -1148,7 +1135,7 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p)
     wxString arg;
     arg.reserve(1024);
 
-    bool isInsideQuotes = FALSE;
+    bool isInsideQuotes = false;
     for ( ;; )
     {
         // skip white space
@@ -1160,83 +1147,46 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p)
             break;
 
         // parse this parameter
-        arg.clear();
-        for ( ;; p++ )
+        bool endParam = false;
+        bool lastBS = false;
+        for ( arg.clear(); !endParam; p++ )
         {
-            // do we have a (lone) backslash?
-            bool isQuotedByBS = FALSE;
-            while ( *p == _T('\\') )
-            {
-                p++;
-
-                // if we have 2 backslashes in a row, output one
-                // unless it looks like a UNC path \\machine\dir\file.ext
-                if ( isQuotedByBS || arg.Len() == 0 )
-                {
-                    arg += _T('\\');
-                    isQuotedByBS = FALSE;
-                }
-                else // the next char is quoted
-                {
-                    isQuotedByBS = TRUE;
-                }
-            }
-
-            bool skipChar = FALSE,
-                 endParam = FALSE;
             switch ( *p )
             {
-                case _T('"'):
-                    if ( !isQuotedByBS )
+            case _T('"'):
+                    if ( !lastBS )
                     {
-                        // don't put the quote itself in the arg
-                        skipChar = TRUE;
-
                         isInsideQuotes = !isInsideQuotes;
-                    }
-                    //else: insert a literal quote
 
+                        // 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'):
-                    // we intentionally don't check for preceding backslash
-                    // here as if we allowed it to be used to escape spaces the
-                    // cmd line of the form "foo.exe a:\ c:\bar" wouldn't be
-                    // parsed correctly
+                    // backslash does *not* quote the space, only quotes do
                     if ( isInsideQuotes )
                     {
-                        // preserve it, skip endParam below
+                        // skip assignment below
                         break;
                     }
-                    //else: fall through
+                    // fall through
 
                 case _T('\0'):
                     endParam = TRUE;
                     break;
-
-                default:
-                    if ( isQuotedByBS )
-                    {
-                        // ignore backslash before an ordinary character - this
-                        // is needed to properly handle the file names under
-                        // Windows appearing in the command line
-                        arg += _T('\\');
-                    }
             }
 
-            // end of argument?
-            if ( endParam )
-                break;
+            lastBS = *p == _T('\\');
 
-            // otherwise copy this char to arg
-            if ( !skipChar )
-            {
-                arg += *p;
-            }
+            arg += *p;
         }
 
-        args.Add(arg);
+        args.push_back(arg);
     }
 
     return args;