git-svn-id: http://apu.dw.local/svnusers/JoshHoltrop/pppc/trunk@51 8131a0b2-b21c-1c47-bd6a-f003126495bd
101 lines
2.4 KiB
C++
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;
|
|
}
|