#ifndef __CMD_H #define __CMD_H #include #include #include #include #include "debug.h" #include "queue.h" #define CMDT_NONE 0 #define CMDT_INT 1 #define CMDT_HEX 2 #define CMDT_BIN 3 #define CMDT_QSTR 4 #define CMDT_STR 5 #define CMDT_WORD 6 #define CMDT_SP 7 #define CMDE_NONE 0 //do nothing #define CMDE_AUTOCOMPLETE 1 //try to auto complete first command #define CMDE_ALIAS 2 //command aliases #define CMD_EOK 0 //all ok #define CMD_EEXE 1 //command execution error #define CMD_ECMD 2 //unknown command #define CMD_HISTORY_SIZE 16 //fixed size history /* Arch [CLI]------->[PARSE] [FILE]----/ [PARSE]-------->[[EXEC]->[HISTORY] other extra features] [CMDLIST]----/ */ /* Token list that comes from parser */ typedef struct cmd_tok_t { char *s,*e; int sz; int type; struct cmd_tok_t *next; } cmd_tok_t; /* Argument list passed to callback cmd functions */ typedef struct cmd_arg_t { int argc; char **argv; int *type; /* bad practice stuff */ int __sub_cmd; // if 1 then dont free argv stuff } cmd_arg_t; /* Table of defined commands */ typedef struct cmd_table_t { char *cmd; int (*clb)(cmd_arg_t*); //callback to command int (*hlp)(cmd_arg_t*); //help command int (*pre)(cmd_arg_t*); //preconditions for execution int (*autocpl)(cmd_arg_t*); //autocomplete according to context } cmd_table_t; /* autocomplete suggestions from command list. Used for autcomplet "" */ struct cmd_acq_t { char *suggestion; SLIST_ENTRY(cmd_acq_t) next_sugg; }; SLIST_HEAD(cmd_acq_head_t,cmd_acq_t); /* Contain all non cli parsing execution things. Manage history and logging Manage command loading from file Manage autocomplete */ typedef struct cmd_mng_t { int flag_history; /*simple que*/ int history_size; char *history[CMD_HISTORY_SIZE]; //not yet ready //int flag_logging; // flag turn on/off autocomplete int flag_autocomplete; cmd_table_t *table; } cmd_mng_t; cmd_tok_t* cmd_tok_create( char *s, char *e, int sz, int type ); int cmd_tok_add( cmd_tok_t *tok, cmd_tok_t *next ); int cmd_tok_print( cmd_tok_t *tok ); void cmd_tok_destroy( cmd_tok_t *tok ); //clean token by ->next token int cmd_tok_count( cmd_tok_t *tok ); cmd_arg_t* cmd_arg_create( cmd_tok_t *tok ); cmd_arg_t* cmd_arg_sub( cmd_arg_t *arg ); //just return without first arg cmd_arg_t* cmd_arg_sub_empty(); void cmd_arg_destroy( cmd_arg_t *arg ); int cmd_exec( cmd_table_t *tbl, cmd_arg_t *arg ); int cmd_exec_ev( cmd_table_t *tbl, cmd_arg_t *arg, int event ); //auto complete and all other char* cmd_ac( cmd_table_t *tbl, const char *s ); //autocomplete struct cmd_acq_head_t* cmd_acq( cmd_table_t *tbl, const char *s ); //autocomplete void cmd_acq_free( struct cmd_acq_head_t *acq ); /* If history is on. PARAM: cmng - cli manager index - index value in history RETURN: return non-NULL value if there something */ char* cmd_mng_history( cmd_mng_t *cmng, int index ); /* PARAM: cmng cmd - non complete command, not to execute, seach for suggestions RETURN: [FREE] return string list of autocomplete commands */ char* cmd_mng_autocomplete( cmd_mng_t *cmng, char *cmd, size_t cmd_sz ); /* PARAM: cmng cmd - command to execute expect NULL at the end RETURN: return result of execution */ int cmd_mng_exec( cmd_mng_t *cmng, const char *cmd, size_t sz_cmd ); /* Free resources that where givent to cmd manager, like history */ int cmd_mng_free( cmd_mng_t *cmng); #define STR_AC_EQ(A,B) (strncmp_ac((A),(B),strlen(A))==(strlen(A)+1)) #define STR_AC_PEQ(A,B) (strncmp_ac((A),(B),strlen(A))<(strlen(A))) /* Clothest match function AA AB = (1) equile <100% AA AA = (3) equite 100% AA AAA = (2) equile 100% but there is more A B = (0) not equile at all */ int strncmp_ac( const char *s1, const char *s2, const int n); #endif