summaryrefslogtreecommitdiff
path: root/libcmd/cmd.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcmd/cmd.h')
-rw-r--r--libcmd/cmd.h97
1 files changed, 93 insertions, 4 deletions
diff --git a/libcmd/cmd.h b/libcmd/cmd.h
index 736cb2b..a7ba143 100644
--- a/libcmd/cmd.h
+++ b/libcmd/cmd.h
@@ -13,14 +13,36 @@
#define CMDT_INT 1
#define CMDT_HEX 2
#define CMDT_BIN 3
-#define CMDT_STR 4
-#define CMDT_WORD 5
-#define CMDT_SP 6
+#define CMDT_QSTR 4
+#define CMDT_STR 5
+#define CMDT_WORD 6
+#define CMDT_SP 7
+#define CMDT_FLOAT 8
#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;
@@ -29,6 +51,10 @@ typedef struct cmd_tok_t
struct cmd_tok_t *next;
} cmd_tok_t;
+/*
+Argument list passed to callback cmd functions
+*/
+
typedef struct cmd_arg_t
{
int argc;
@@ -39,13 +65,22 @@ typedef struct cmd_arg_t
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*);
+ 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 "<TAB>"
+*/
struct cmd_acq_t
{
char *suggestion;
@@ -53,6 +88,28 @@ struct cmd_acq_t
};
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 );
@@ -70,6 +127,38 @@ 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)))