diff --git a/include/ucore/cmd/cmd.h b/include/ucore/cmd/cmd.h new file mode 100644 index 0000000..8c9880a --- /dev/null +++ b/include/ucore/cmd/cmd.h @@ -0,0 +1,48 @@ +#ifndef UC_CMD_H_ +#define UC_CMD_H_ + +#include + +enum UCCmdResult { + UC_CMDRES_OK, + UC_CMDRES_WARN, + UC_CMDRES_ERR +}; + +struct UCCmdDef; +struct UCVTerm; +typedef enum UCCmdResult (*uc_cmd_handler)(struct UCCmd *cmd, struct UCVTerm *term, int arg, char *argv[]); + +struct UCCmdDef { + uint32_t cmd_id; + uint32_t cmd_flags; + const char *cmd_syntax; + const char *cmd_desc; + uc_cmd_handler cmd_cb; +}; + + +#define UC_DEF_CMD_DEF(id, flags, syntax, desc)\ +static const struct UCCmdDef uc_cmd_def ## cmd_id {\ + .cmd_id = cmd_id,\ + .cmd_flags = flags,\ + .cmd_syntax = syntax,\ + .cmd_desc = desc,\ +}; + +#define UC_DEF_CMD_FUNC(id)\ +static enum UCCmdResult uc_cmd_func_ ## id (struct UCCmd *cmd, struct UCVTerm *term, int nargs, char *args[]) + +#define UC_DEF_CMD(id, flags, syntax, desc)\ + UC_DEF_CMD_DEF(id, flags, syntax, desc)\ + UC_DEF_CMD_FUNC(id) + +UC_DEF_CMD(111, 0 , +"show peers", +"Show all connected peers") +{ + +} + +#endif +/ diff --git a/src/cmd/cmd.c b/src/cmd/cmd.c new file mode 100644 index 0000000..9459958 --- /dev/null +++ b/src/cmd/cmd.c @@ -0,0 +1,54 @@ +#include + +enum UCCmdRc { + /**Executed ok */ + UC_CMD_OK, + /**Executed with warning */ + UC_CMD_WARNING, + /*Not executed, incomplete command */ + UC_CMD_INCOMPLETE, + /*Not executed, generic error */ + UC_CMD_ERROR, +}; + +typedef enum UCCmdRc (*uc_cmd_handler)(int narg, char *args[]); +typedef void (*uc_cmd_write_cfg)(void); + +#define UC_CMD_FL_HIDDEN (1 << 0) + +struct UCCmdNode; +struct UCCmdDef; + +struct UCCmdSettings { + const char *name; + const char *version; + const char *boot_cfg_file; + + struct UCCmdNode *initial_node; + struct UCCmdNode *node_head; +}; + +struct UCCmdNode { + int id; + uc_cmd_write_cfg write_func; + struct UCCmdDef *cmd_head; //linked list of UCCmdDef + struct UCCmdNode *next; +}; + +struct UCCmdDef { + const char *cmd; + const char **help; + size_t cmd_len; + uc_cmd_handler cb; + uint32_t flags; + + struct UCCmdDef *next; +}; + + +void uc_cmd_init(const char *app_name, const char *version); +int uc_cmd_read_config(const char *filename); +void uc_cmd_set_configfile(const char *filename); +void uc_cmd_add_cmd(struct UCCmdDef *cmd, int parent_node_id); +void uc_cmd_set_default_node(int node_id); +