#pragma once // command line utility // // created on 2023-02-10 // #include "base.h" #include #include #include #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 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 cmd_routine_; quit_cmd(*un_handle_)(cmd_line*, void*); void* un_handle_param_; static std::vector super_cmd_routine_; static void add_command(std::vector& 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); };