115 lines
2.5 KiB
C++
115 lines
2.5 KiB
C++
#include "commandparser.h"
|
|
|
|
Command::Command(const String & command)
|
|
{
|
|
ParseState state = Default;
|
|
int len = (int)command.length();
|
|
for(int i = 0; i < len; i++)
|
|
{
|
|
char ch = command[i];
|
|
switch(state)
|
|
{
|
|
case Default:
|
|
switch(ch)
|
|
{
|
|
case ' ':
|
|
if(!_tokens.size())
|
|
dataFinish();
|
|
break;
|
|
case ',':
|
|
dataFinish();
|
|
break;
|
|
case '\\':
|
|
state = Escaped;
|
|
break;
|
|
case '\"':
|
|
state = Text;
|
|
break;
|
|
default:
|
|
dataAppend(ch);
|
|
break;
|
|
}
|
|
break;
|
|
case Escaped:
|
|
switch(ch)
|
|
{
|
|
case ' ':
|
|
dataAppend(ch);
|
|
break;
|
|
case ',':
|
|
dataAppend(ch);
|
|
break;
|
|
case '\"':
|
|
dataAppend(ch);
|
|
break;
|
|
default:
|
|
dataAppend('\\');
|
|
dataAppend(ch);
|
|
break;
|
|
}
|
|
state = Default;
|
|
break;
|
|
case Text:
|
|
switch(ch)
|
|
{
|
|
case '\\':
|
|
state = TextEscaped;
|
|
break;
|
|
case '\"':
|
|
dataFinish();
|
|
state = Default;
|
|
break;
|
|
default:
|
|
dataAppend(ch);
|
|
break;
|
|
}
|
|
break;
|
|
case TextEscaped:
|
|
switch(ch)
|
|
{
|
|
case '\"':
|
|
dataAppend(ch);
|
|
break;
|
|
default:
|
|
dataAppend('\\');
|
|
dataAppend(ch);
|
|
break;
|
|
}
|
|
state = Text;
|
|
break;
|
|
}
|
|
}
|
|
if(state == Escaped || state == TextEscaped)
|
|
dataAppend('\\');
|
|
dataFinish();
|
|
}
|
|
|
|
const String Command::GetText()
|
|
{
|
|
return _tokens.size() ? _tokens[0] : String();
|
|
}
|
|
|
|
const int Command::GetArgCount()
|
|
{
|
|
return _tokens.size() ? (int)_tokens.size() - 1 : 0;
|
|
}
|
|
|
|
const String Command::GetArg(int argnum)
|
|
{
|
|
return (int)_tokens.size() < argnum + 1 ? String() : _tokens[argnum + 1];
|
|
}
|
|
|
|
void Command::dataAppend(const char ch)
|
|
{
|
|
_data += ch;
|
|
}
|
|
|
|
void Command::dataFinish()
|
|
{
|
|
if(_data.length())
|
|
{
|
|
_tokens.push_back(_data);
|
|
_data.clear();
|
|
}
|
|
}
|