/** * @file myCmd.h * @brief 命令处理框架 — 纯 C 接口 * @details 命令注册/分发/补全,内置 linenoise 行编辑。 * 通过 `__attribute__((constructor))` 实现模块自动注册。 */ #ifndef _MY_CMD_H_ #define _MY_CMD_H_ #include "myBase.h" #ifdef __cplusplus extern "C" { #endif typedef struct { const char *name; void (*func)(int argc, char *argv[]); const char *desc; void (*complete)(const char *buf, char ***completions, int *ncomp); } stru_cmd; /** 注册命令 */ void cmd_manager_add_command(const char *name, void (*func)(int argc, char *argv[]), const char *desc, void (*complete)(const char *, char ***, int *)); /** 获取所有已注册命令列表 */ stru_cmd *cmd_manager_get_commands(unsigned int *out_count); /** 打印帮助信息 */ void cmd_help(int argc, char *argv[]); /** 按名称查找命令 */ stru_cmd *cmd_find(const char *name); /** Tab 自动补全回调 */ void cmd_complete(const char *buf, char ***completions, int *ncomp); /** 子命令补全 */ void cmd_sub_complete(const char *buf, char ***completions, int *ncomp, const char **subs, int sub_count); /** 行编辑交互式输入 */ char *linenoise(const char *prompt); /** 释放 linenoise 返回的内存 */ void linenoiseFree(void *ptr); /** 添加历史记录 */ int linenoiseHistoryAdd(const char *line); /** 释放所有历史 */ void linenoiseHistoryFree(void); /** 设置自动补全回调 */ void lineniseSetCompletionCallback(void (*cb)(const char *, char ***, int *)); /** 注册命令宏(无补全) */ #define CMD_REGISTER(cmd_name, func_ptr, cmd_desc) \ __attribute__((constructor)) static void register_##func_ptr(void) \ { \ cmd_manager_add_command(cmd_name, func_ptr, cmd_desc, NULL); \ } /** 注册命令宏(带补全) */ #define CMD_REGISTER_C(cmd_name, func_ptr, cmd_desc, complete) \ __attribute__((constructor)) static void register_##func_ptr(void) \ { \ cmd_manager_add_command(cmd_name, func_ptr, cmd_desc, complete); \ } #ifdef __cplusplus } #endif #endif