#include "cmd.h" namespace parser { static void command_line_to_arguments(const char* cmdl, std::vector& 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; }