pppc/parseCmdLine.cc
2009-08-19 17:08:38 +00:00

101 lines
2.4 KiB
C++

#include "parseCmdLine.h"
#include "trim.h"
#include <iostream>
using namespace std;
std::vector<std::string> parseCmdLine(char * cmdline)
{
enum { WSSKIP, GATHERING, SQUOTE, DQUOTE } state = WSSKIP;
vector<string> args;
string arg;
for (; *cmdline; cmdline++)
{
char c = *cmdline;
switch (state)
{
case WSSKIP:
if (!isspace(c))
{
if (c == '\'')
{
state = SQUOTE;
arg = "";
}
else if (c == '"')
{
state = DQUOTE;
arg = "";
}
else
{
state = GATHERING;
arg = c;
}
}
break;
case GATHERING:
if (c == '\'')
{
state = SQUOTE;
}
else if (c == '"')
{
state = DQUOTE;
}
else if (isspace(c))
{
args.push_back(arg);
state = WSSKIP;
}
else
{
arg += c;
}
break;
case SQUOTE:
if (c == '\'')
{
state = GATHERING;
}
else
{
arg += c;
}
break;
case DQUOTE:
if (c == '"')
{
state = GATHERING;
}
else
{
arg += c;
}
break;
}
}
switch (state)
{
case WSSKIP:
break;
case GATHERING:
args.push_back(arg);
break;
case SQUOTE:
cerr << "Warning: unmatched '\\'' character!" << endl;
break;
case DQUOTE:
cerr << "Warning: unmatched '\"' character!" << endl;
break;
}
for (int args_len = args.size(), i = 0; i < args_len; i++)
{
args[i] = trim(args[i]);
}
return args;
}