]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cmdline.cpp
bug fix for wxBufferedInputStream::LastCount() after Read()
[wxWidgets.git] / src / common / cmdline.cpp
index 142cf53dadd93cc920352dd480bcbc1e660d8265..2b550d15ec8ff82dac3bca6045f137aa16a07f90 100644 (file)
@@ -109,7 +109,9 @@ struct wxCmdLineOption
 
 public:
     wxCmdLineEntryType kind;
-    wxString shortName, longName, description;
+    wxString shortName,
+             longName,
+             description;
     wxCmdLineParamType type;
     int flags;
 
@@ -476,7 +478,7 @@ void wxCmdLineParser::Reset()
 // the real work is done here
 // ----------------------------------------------------------------------------
 
-int wxCmdLineParser::Parse()
+int wxCmdLineParser::Parse(bool showUsage)
 {
     bool maybeOption = TRUE;    // can the following arg be an option?
     bool ok = TRUE;             // TRUE until an error is detected
@@ -803,7 +805,7 @@ int wxCmdLineParser::Parse()
         }
     }
 
-    if ( !ok )
+    if ( !ok && showUsage )
     {
         Usage();
     }
@@ -849,13 +851,30 @@ void wxCmdLineParser::Usage()
             brief << _T('[');
         }
 
-        brief << chSwitch << opt.shortName;
+        if ( !opt.shortName.empty() )
+        {
+            brief << chSwitch << opt.shortName;
+        }
+        else if ( !opt.longName.empty() )
+        {
+            brief << _T("--") << opt.longName;
+        }
+        else
+        {
+            wxFAIL_MSG( _T("option without neither short nor long name?") );
+        }
 
         wxString option;
-        option << _T("  ") << chSwitch << opt.shortName;
-        if ( !!opt.longName )
+
+        if ( !opt.shortName.empty() )
         {
-            option << _T("  --") << opt.longName;
+            option << _T("  ") << chSwitch << opt.shortName;
+        }
+
+        if ( !opt.longName.empty() )
+        {
+            option << (option.empty() ? _T("  ") : _T(", "))
+                   << _T("--") << opt.longName;
         }
 
         if ( opt.kind != wxCMD_LINE_SWITCH )
@@ -904,7 +923,13 @@ void wxCmdLineParser::Usage()
         wxLogMessage(m_data->m_logo);
     }
 
+    // in console mode we want to show the brief usage message first, then the
+    // detailed one but in GUI build we give the details first and then the
+    // summary - like this, the brief message appears in the wxLogGui dialog,
+    // as expected
+#if !wxUSE_GUI
     wxLogMessage(brief);
+#endif // !wxUSE_GUI
 
     // now construct the detailed help message
     size_t len, lenMax = 0;
@@ -927,6 +952,11 @@ void wxCmdLineParser::Usage()
     }
 
     wxLogMessage(detailed);
+
+    // do it now if not done above
+#if wxUSE_GUI
+    wxLogMessage(brief);
+#endif // wxUSE_GUI
 }
 
 // ----------------------------------------------------------------------------
@@ -1015,7 +1045,7 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p)
 
                 case _T(' '):
                 case _T('\t'):
-                    if ( isInsideQuotes )
+                    if ( isInsideQuotes || isQuotedByBS )
                     {
                         // preserve it, skip endParam below
                         break;
@@ -1025,6 +1055,15 @@ wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxChar *p)
                 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?