code_util/cmd.h

149 lines
4.8 KiB
C
Raw Permalink Normal View History

2023-02-24 09:24:48 +00:00
#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);
};