107 lines
1.6 KiB
C++
107 lines
1.6 KiB
C++
#include "cmd.h"
|
|
|
|
|
|
|
|
|
|
namespace parser
|
|
{
|
|
static void command_line_to_arguments(const char* cmdl, std::vector<std::string>& args)
|
|
{
|
|
while(*cmdl)
|
|
{
|
|
const char* h = cmdl;
|
|
while(*h == ' ' || *h == '\t')
|
|
h++;
|
|
if(*h == 0)
|
|
break;
|
|
|
|
cmdl = h;
|
|
if(*h == '\"')
|
|
{
|
|
cmdl++;
|
|
h++;
|
|
while(*h)
|
|
{
|
|
if(*h == '\"')
|
|
break;
|
|
if(*h == '\\')
|
|
h++;
|
|
h++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while(*h)
|
|
{
|
|
if(*h == ' ' || *h == '\t')
|
|
break;
|
|
h++;
|
|
}
|
|
}
|
|
if(h > cmdl)
|
|
args.push_back(std::string(cmdl, h - cmdl));
|
|
else if(*h == '\"')
|
|
args.push_back("");
|
|
|
|
if(*h == 0)
|
|
break;
|
|
|
|
cmdl = h + 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
cmd_line::cmd_line()
|
|
{}
|
|
cmd_line::~cmd_line()
|
|
{}
|
|
|
|
cmd_line* cmd_line::from_console(const char* tips)
|
|
{
|
|
std::string in("");
|
|
char ch = 0;
|
|
|
|
if(!tips || *tips == 0)
|
|
tips = "input";
|
|
|
|
printf("%s%s>%s", CONSOLE_COLOR_FRONT_BLUE, tips, CONSOLE_COLOR_NONE);
|
|
while((ch = getchar()) != '\n')
|
|
in.append(1, ch);
|
|
|
|
return cmd_line::from_command_line(in.c_str());
|
|
}
|
|
cmd_line* cmd_line::from_command_line(const char* cmdl)
|
|
{
|
|
cmd_line* cmd = new cmd_line();
|
|
|
|
cmd->cmd_line_ = cmdl;
|
|
parser::command_line_to_arguments(cmdl, cmd->arguments_);
|
|
|
|
return cmd;
|
|
}
|
|
|
|
size_t cmd_line::count(void)
|
|
{
|
|
return arguments_.size();
|
|
}
|
|
const char* cmd_line::parameter(int ind)
|
|
{
|
|
if(ind >= 0 && ind < arguments_.size())
|
|
return arguments_[ind].c_str();
|
|
else
|
|
return nullptr;
|
|
}
|
|
const char* cmd_line::parameter(const char* key)
|
|
{
|
|
for(int i = 0; i < arguments_.size() - 1; ++i)
|
|
{
|
|
if(arguments_[i] == key)
|
|
return arguments_[i + 1].c_str();
|
|
}
|
|
|
|
return nullptr;
|
|
}
|