add CommandParser class
This commit is contained in:
parent
726bd8bfaa
commit
116faff062
74
src/core/CommandParser.cc
Normal file
74
src/core/CommandParser.cc
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#include "CommandParser.h"
|
||||||
|
|
||||||
|
bool CommandParser::parse(const EncodedString & command)
|
||||||
|
{
|
||||||
|
std::vector<uint8_t> current_arg;
|
||||||
|
EncodedString::iterator end = command.end();
|
||||||
|
EncodedString::iterator it = command.begin();
|
||||||
|
uint32_t quote = 0u;
|
||||||
|
bool arg_content = false;
|
||||||
|
auto append_char = [¤t_arg, &it, &command, &arg_content]() {
|
||||||
|
size_t offset = it.offset();
|
||||||
|
for (size_t i = 0u, sz = it.size(); i < sz; i++)
|
||||||
|
{
|
||||||
|
current_arg.push_back(command[offset + i]);
|
||||||
|
}
|
||||||
|
arg_content = true;
|
||||||
|
};
|
||||||
|
auto collect_arg = [this, ¤t_arg, &arg_content] {
|
||||||
|
if (arg_content)
|
||||||
|
{
|
||||||
|
m_args.push_back(std::make_shared<EncodedString>(¤t_arg[0], current_arg.size()));
|
||||||
|
current_arg.clear();
|
||||||
|
arg_content = false;
|
||||||
|
}
|
||||||
|
arg_content = false;
|
||||||
|
};
|
||||||
|
while (it != end)
|
||||||
|
{
|
||||||
|
uint32_t cp = *it;
|
||||||
|
if ((quote != 0u) && (cp == quote))
|
||||||
|
{
|
||||||
|
quote = 0u;
|
||||||
|
++it;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ((quote == 0u) && ((cp == '\'') || (cp == '"')))
|
||||||
|
{
|
||||||
|
quote = cp;
|
||||||
|
++it;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (cp == '\\')
|
||||||
|
{
|
||||||
|
if (++it == end)
|
||||||
|
{
|
||||||
|
m_parse_error = "Unterminated escape sequence";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
append_char();
|
||||||
|
++it;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (cp == ' ')
|
||||||
|
{
|
||||||
|
collect_arg();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
append_char();
|
||||||
|
++it;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quote != 0u)
|
||||||
|
{
|
||||||
|
m_parse_error = std::string("Unterminated quoted region");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_arg();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
30
src/core/CommandParser.h
Normal file
30
src/core/CommandParser.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef COMMANDPARSER_H
|
||||||
|
#define COMMANDPARSER_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include "EncodedString.h"
|
||||||
|
|
||||||
|
class CommandParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool parse(const EncodedString & command);
|
||||||
|
std::shared_ptr<EncodedString> operator[](size_t index) const
|
||||||
|
{
|
||||||
|
return m_args[index];
|
||||||
|
}
|
||||||
|
size_t size() const
|
||||||
|
{
|
||||||
|
return m_args.size();
|
||||||
|
}
|
||||||
|
const std::string & parse_error() const
|
||||||
|
{
|
||||||
|
return m_parse_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::vector<std::shared_ptr<EncodedString>> m_args;
|
||||||
|
std::string m_parse_error;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user