+
+/*
+Returns a string which is equal to the string pointed to by p, but up to the
+point where p contains an character that's not allowed.
+Allowable characters are letters and numbers, and characters pointed to by
+the parameter allowedChars.
+
+For example, if p points to "abcde-@-_", and allowedChars is "-_",
+this function returns "abcde-".
+*/
+static wxString GetOptionName(wxString::const_iterator p,
+ wxString::const_iterator end,
+ const wxChar *allowedChars)
+{
+ wxString argName;
+
+ while ( p != end && (wxIsalnum(*p) || wxStrchr(allowedChars, *p)) )
+ {
+ argName += *p++;
+ }
+
+ return argName;
+}
+
+// Besides alphanumeric characters, short and long options can
+// have other characters.
+
+// A short option additionally can have these
+#define wxCMD_LINE_CHARS_ALLOWED_BY_SHORT_OPTION wxT("_?")
+
+// A long option can have the same characters as a short option and a '-'.
+#define wxCMD_LINE_CHARS_ALLOWED_BY_LONG_OPTION \
+ wxCMD_LINE_CHARS_ALLOWED_BY_SHORT_OPTION wxT("-")
+
+static wxString GetShortOptionName(wxString::const_iterator p,
+ wxString::const_iterator end)
+{
+ return GetOptionName(p, end, wxCMD_LINE_CHARS_ALLOWED_BY_SHORT_OPTION);
+}
+
+static wxString GetLongOptionName(wxString::const_iterator p,
+ wxString::const_iterator end)
+{
+ return GetOptionName(p, end, wxCMD_LINE_CHARS_ALLOWED_BY_LONG_OPTION);
+}
+
+#endif // wxUSE_CMDLINE_PARSER
+
+// ----------------------------------------------------------------------------
+// global functions
+// ----------------------------------------------------------------------------
+
+/*
+ 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 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 */
+wxArrayString wxCmdLineParser::ConvertStringToArgs(const wxString& cmdline)
+{
+ wxArrayString args;
+
+ wxString arg;
+ arg.reserve(1024);
+
+ bool isInsideQuotes = false;
+
+ wxString::const_iterator p = cmdline.begin();
+
+ for ( ;; )
+ {
+ // skip white space
+ while ( p != cmdline.end() && (*p == _T(' ') || *p == _T('\t')) )
+ ++p;
+
+ // anything left?
+ if ( p == cmdline.end() )
+ break;
+
+ // parse this parameter
+ bool endParam = false;
+ bool lastBS = false;
+ for ( arg.clear(); !endParam; p++ )
+ {
+ switch ( (*p).GetValue() )
+ {
+ 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;
+
+ break;
+ }
+
+ if ( endParam )
+ {
+ break;
+ }
+
+ lastBS = *p == _T('\\');
+
+ arg += *p;
+ }
+
+ args.push_back(arg);
+ }
+
+ return args;
+}