Wednesday, June 12, 2013

Simple C++ command-line parser for Windows

Because Windows doesn't have this built-in. Supports quotes. Remember that the first argument returned by GetCommandLine is the application itself.
// Where "tstring" is a typedef for basic_string of TCHAR
void ParseCommandLine (const TCHAR* args, OUT vector<tstring>& list)
{
  bool inQuotes = false;
 
  for (const TCHAR* p = args; *p;) {
    while (isspace(*p))
      p++;
    if (*p == '\0')
      return;

    // Scan to the end of the argument
    PCTSTR start;
    for (start = p; *p != '\0' && (inQuotes || !isspace(*p)); p++)
      if (*p == '"')
        inQuotes = !inQuotes;

    // Strip quotes if they are along the outside (e.g. the quotes are 
    // preserved for --out:"some thing" but stripped from "--out:some thing")
    if (*start == '"' && p[-1] == '"')
      list.push_back(tstring(start + 1, p - start - 2));
    else
      list.push_back(tstring(start, p - start));
   }
}
Usage:
vector<tstring> list;
ParseCommandLine(GetCommandLine(), list);

0 Comments:

Post a Comment

<< Home