code_scanner/common/cmd.cpp

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;
}