mirror of http://192.168.1.51:8099/gb/code_util
149 lines
4.8 KiB
C++
149 lines
4.8 KiB
C++
#pragma once
|
|
|
|
// command line utility
|
|
//
|
|
// created on 2023-02-10
|
|
//
|
|
|
|
#include "base.h"
|
|
#include <string>
|
|
#include <vector>
|
|
#include <algorithm>
|
|
|
|
#define CONSOLE_COLOR_NONE "\033[0m"
|
|
#define CONSOLE_COLOR_FRONT_BLACK "\033[0;30m"
|
|
#define CONSOLE_COLOR_FRONT_DARK_GRAY "\033[1;30m"
|
|
#define CONSOLE_COLOR_FRONT_RED "\033[0;31m"
|
|
#define CONSOLE_COLOR_FRONT_LIGHT_RED "\033[1;31m"
|
|
#define CONSOLE_COLOR_FRONT_GREEN "\033[0;32m"
|
|
#define CONSOLE_COLOR_FRONT_LIGHT_GREEN "\033[1;32m"
|
|
#define CONSOLE_COLOR_FRONT_BROWN "\033[0;33m"
|
|
#define CONSOLE_COLOR_FRONT_YELLOW "\033[1;33m"
|
|
#define CONSOLE_COLOR_FRONT_BLUE "\033[0;34m"
|
|
#define CONSOLE_COLOR_FRONT_LIGHT_BLUE "\033[1;34m"
|
|
#define CONSOLE_COLOR_FRONT_PURPLE "\033[0;35m"
|
|
#define CONSOLE_COLOR_FRONT_LIGHT_PURPLE "\033[1;35m"
|
|
#define CONSOLE_COLOR_FRONT_CYAN "\033[0;36m"
|
|
#define CONSOLE_COLOR_FRONT_LIGHT_CYAN "\033[1;36m"
|
|
#define CONSOLE_COLOR_FRONT_LIGHT_GRAY "\033[0;37m"
|
|
#define CONSOLE_COLOR_FRONT_WHITE "\033[1;37m"
|
|
|
|
#define CONSOLE_COLOR_BACK_BLACK "\033[0;40m"
|
|
#define CONSOLE_COLOR_BACK_DARK_GRAY "\033[1;40m"
|
|
#define CONSOLE_COLOR_BACK_RED "\033[0;41m"
|
|
#define CONSOLE_COLOR_BACK_LIGHT_RED "\033[1;41m"
|
|
#define CONSOLE_COLOR_BACK_GREEN "\033[0;42m"
|
|
#define CONSOLE_COLOR_BACK_LIGHT_GREEN "\033[1;42m"
|
|
#define CONSOLE_COLOR_BACK_BROWN "\033[0;43m"
|
|
#define CONSOLE_COLOR_BACK_YELLOW "\033[1;43m"
|
|
#define CONSOLE_COLOR_BACK_BLUE "\033[0;44m"
|
|
#define CONSOLE_COLOR_BACK_LIGHT_BLUE "\033[1;44m"
|
|
#define CONSOLE_COLOR_BACK_PURPLE "\033[0;45m"
|
|
#define CONSOLE_COLOR_BACK_LIGHT_PURPLE "\033[1;45m"
|
|
#define CONSOLE_COLOR_BACK_CYAN "\033[0;46m"
|
|
#define CONSOLE_COLOR_BACK_LIGHT_CYAN "\033[1;46m"
|
|
#define CONSOLE_COLOR_BACK_LIGHT_GRAY "\033[0;47m"
|
|
#define CONSOLE_COLOR_BACK_WHITE "\033[1;47m"
|
|
|
|
|
|
namespace console
|
|
{
|
|
// special effects:
|
|
// \033[0m close all attributes
|
|
// \033[1m set high-light
|
|
// \033[4m underline
|
|
// \033[5m blink
|
|
// \033[7m reverse(反显)
|
|
// \033[8m blanking(消隐)
|
|
// \033[30m -- \033[37m set foreground color
|
|
// \033[40m -- \033[47m set background color
|
|
//
|
|
// cursor position:
|
|
// \033[nA move up n lines
|
|
// \033[nB move down n lines
|
|
// \033[nC move right n cols
|
|
// \033[nD move left n cols
|
|
// \033[y;xH set cursor position
|
|
// \033[2J clear screen
|
|
// \033[K clear the line after cursor position
|
|
// \033[s save cursor position
|
|
// \033[u restore cursor position
|
|
// \033[?25l hide cursor
|
|
// \033[?25h show cursor
|
|
};
|
|
|
|
class cmd_line : public refer
|
|
{
|
|
std::string cmd_line_;
|
|
std::vector<std::string> arguments_;
|
|
|
|
protected:
|
|
cmd_line();
|
|
~cmd_line();
|
|
|
|
public:
|
|
static cmd_line* from_console(const char* tips);
|
|
static cmd_line* from_command_line(const char* cmdl);
|
|
|
|
public:
|
|
size_t count(void);
|
|
const char* parameter(int ind);
|
|
const char* parameter(const char* key);
|
|
void remove(int ind); // remove parameter at ind
|
|
void remove(const char* key); // remove parameters named 'key' and the next
|
|
std::string to_command_line(void);
|
|
};
|
|
|
|
|
|
#define PASTE(a, b) a##b
|
|
#define CONSOLE_ROUTINE(func) \
|
|
quit_cmd func(cmd_line* cmd, void* param)
|
|
|
|
enum quit_cmd
|
|
{
|
|
QUIT_CMD_NONE = 0,
|
|
QUIT_CMD_QUIT_ME,
|
|
QUIT_CMD_QUIT_ALL,
|
|
};
|
|
class console_dispatcher : public refer
|
|
{
|
|
typedef struct _cmd_routine
|
|
{
|
|
std::string cmd;
|
|
void* param;
|
|
quit_cmd(*routine)(cmd_line* cmd, void* param);
|
|
|
|
bool operator==(const char* command)
|
|
{
|
|
return cmd == command;
|
|
}
|
|
bool operator<(const _cmd_routine& r)
|
|
{
|
|
return cmd.compare(r.cmd) < 0;
|
|
}
|
|
}CMDROUT;
|
|
std::vector<CMDROUT> cmd_routine_;
|
|
quit_cmd(*un_handle_)(cmd_line*, void*);
|
|
void* un_handle_param_;
|
|
|
|
static std::vector<CMDROUT> super_cmd_routine_;
|
|
|
|
static void add_command(std::vector<CMDROUT>& routine, const char* cmd, quit_cmd(*handle)(cmd_line*, void*), void* param);
|
|
static quit_cmd unhandled(cmd_line* cmd, void* param);
|
|
|
|
quit_cmd dispatch_command(cmd_line* cmd); // return whether continue
|
|
|
|
public:
|
|
console_dispatcher();
|
|
~console_dispatcher();
|
|
|
|
public:
|
|
static void add_supper_command_routine(const char* cmd, quit_cmd(*handle)(cmd_line*, void*), void* param = nullptr);
|
|
static void print_sector(uint8_t* data, size_t bytes, uint64_t addr = 0);
|
|
|
|
void add_command_routine(const char* cmd, quit_cmd(*handle)(cmd_line*, void*), void* param = nullptr);
|
|
void set_unhandled_routine(quit_cmd(*handle)(cmd_line*, void*), void* param = nullptr);
|
|
quit_cmd run(const char* tips, const char* cmdl = nullptr);
|
|
};
|
|
|