summaryrefslogtreecommitdiffstats
path: root/cmd/cmd.h
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/cmd.h')
-rw-r--r--cmd/cmd.h174
1 files changed, 174 insertions, 0 deletions
diff --git a/cmd/cmd.h b/cmd/cmd.h
new file mode 100644
index 0000000..a7ba143
--- /dev/null
+++ b/cmd/cmd.h
@@ -0,0 +1,174 @@
+#ifndef __CMD_H
+#define __CMD_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#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 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;
+ 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 "<TAB>"
+*/
+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 \ No newline at end of file