pppc/parseCmdLine.cc
joshholtrop cfb6dd739b added parseCmdLine module
git-svn-id: http://apu.dw.local/svnusers/JoshHoltrop/pppc/trunk@45 8131a0b2-b21c-1c47-bd6a-f003126495bd
2009-08-03 19:29:21 +00:00

112 lines
2.7 KiB
C++

#include "parseCmdLine.h"
#include <iostream>
using namespace std;
static std::string trim(const std::string & orig)
{
const char ws[] = " \t\r\n\v\f";
size_t first = orig.find_first_not_of(ws);
size_t last = orig.find_last_not_of(ws);
if (first == string::npos || last == string::npos)
{
return "";
}
return string(orig, first, last - first + 1);
}
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;
}