summaryrefslogtreecommitdiff
path: root/libcmd
diff options
context:
space:
mode:
Diffstat (limited to 'libcmd')
-rw-r--r--libcmd/Makefile2
-rw-r--r--libcmd/cmd.c199
-rw-r--r--libcmd/cmd.h97
-rw-r--r--libcmd/cmd_parse.c173
-rw-r--r--libcmd/cmd_parse.h2
-rw-r--r--libcmd/cmd_parse.ragel59
6 files changed, 417 insertions, 115 deletions
diff --git a/libcmd/Makefile b/libcmd/Makefile
index 86f0ae6..7d67c5d 100644
--- a/libcmd/Makefile
+++ b/libcmd/Makefile
@@ -40,4 +40,4 @@ leak:
clean:
rm -f cmd_cli
- rm -rf *.so *.o *.dot *.pdf
+ rm -rf *.so *.o *.a *.dot *.pdf
diff --git a/libcmd/cmd.c b/libcmd/cmd.c
index c1d43fc..f743a7f 100644
--- a/libcmd/cmd.c
+++ b/libcmd/cmd.c
@@ -1,4 +1,5 @@
#include "cmd.h"
+#include "cmd_parse.h"
cmd_tok_t* cmd_tok_create( char *s, char *e, int sz, int type )
{
@@ -78,6 +79,9 @@ int cmd_tok_print( cmd_tok_t *tok )
case CMDT_SP:
printf("SP");
break;
+ case CMDT_FLOAT:
+ printf("FLOAT");
+ break;
default:
printf("UNKNOWN");
}
@@ -189,7 +193,6 @@ err_malloc_type:
free( ret->argv );
err_malloc_argv:
free( ret );
-err_exit:
return NULL;
}
@@ -268,16 +271,21 @@ int cmd_exec( cmd_table_t *tbl, cmd_arg_t *arg )
{
int ret = -1;
int fret = 0;
+ int pret = 0; //pre condition return
int i;
cmd_arg_t *sub_arg = NULL;
- if ( arg->argc < 1 )
+ //there could be 0 arguments
+ if ( arg->argc < 0 )
{
printf("Hm ... no arguments\n");
return -1;
}
+ if ( arg->argc == 0 )
+ return 0;
+
i = 0;
while ( (tbl[i].cmd != NULL) && (tbl[i].clb != NULL) )
{
@@ -295,7 +303,18 @@ int cmd_exec( cmd_table_t *tbl, cmd_arg_t *arg )
}
sub_arg = cmd_arg_sub( arg );
- fret = tbl[i].clb( sub_arg );
+ //execute callback preconditions
+ if (tbl[i].pre != NULL)
+ {
+ pret = tbl[i].pre( sub_arg );
+ } else {
+ pret = 0; //no precond just pass
+ }
+ if (pret == 0)
+ {
+ //execute callback
+ fret = tbl[i].clb( sub_arg );
+ }
//if command whent wrong or not still clean mem
if ( sub_arg != NULL )
@@ -303,21 +322,23 @@ int cmd_exec( cmd_table_t *tbl, cmd_arg_t *arg )
cmd_arg_destroy( sub_arg );
}
- //command execution whent wrong lets go out
- if ( fret != 0 )
+ //command execution precondtions met but wrong execution
+ if ( pret == 0 )
{
- printf("Command broken execution\n");
- ret = -1;
- break;
+ //command execution whent wrong lets go out
+ if ( fret != 0 )
+ {
+ printf("Command broken execution\n");
+ ret = -1;
+ break;
+ }
}
ret = 0; //succesfull execution
break;
}
i++;
- }
-
-
+ }
return ret;
}
@@ -484,6 +505,162 @@ void cmd_acq_free( struct cmd_acq_head_t *acq )
return;
}
+char* cmd_mng_history( cmd_mng_t *cmng, int index )
+{
+ int idx;
+ char *ret=NULL;
+
+ if (cmng == NULL)
+ {
+ return NULL;
+ }
+
+ if (cmng->history_size < CMD_HISTORY_SIZE)
+ {
+ if (index < cmng->history_size)
+ {
+ ret = cmng->history[index];
+ }
+ } else
+ {
+ idx = (cmng->history_size-CMD_HISTORY_SIZE+index)%CMD_HISTORY_SIZE;
+ ret = cmng->history[idx];
+ }
+
+ return ret;
+}
+
+char* cmd_mng_autocomplete( cmd_mng_t *cmng, char *cmd, size_t cmd_sz )
+{
+ char *ret=NULL;
+
+ cmd_arg_t *args;
+ cmd_tok_t tl, *ptr = &tl, *iter = NULL;
+ cmd_table_t *tab = cmng->table;
+ struct cmd_acq_t *iter_sugg = NULL;
+ int ac_sz=0,cnt_sz=0;
+ char *ac_str;
+ memset( &tl, 0, sizeof( cmd_tok_t ));
+
+ if ( parse_cmd(ptr, cmd, cmd_sz) == -1)
+ {
+ printf("Cmd problems\n");
+ return NULL;
+ }
+
+ iter = ptr->next;
+ args = cmd_arg_create( iter );
+
+ //if command not found offer auto complete options
+ if (args->argc > 0)
+ {
+ struct cmd_acq_head_t *ac = cmd_acq(tab,args->argv[0]);
+ if (ac != NULL)
+ {
+ //calculate string str
+ SLIST_FOREACH(iter_sugg,ac,next_sugg)
+ {
+ //printf("%s ", iter_sugg->suggestion);
+ ac_sz += strlen(iter_sugg->suggestion)+1; //1 for " "
+ }
+ ac_sz += 2; //"> "
+ ac_sz += 1; //"\0"
+
+ ac_str = (char *)malloc(ac_sz);
+
+ memcpy( ac_str, "> ", 2 );
+ cnt_sz = 2;
+ cnt_sz = 0;
+ SLIST_FOREACH(iter_sugg,ac,next_sugg)
+ {
+ //double logical usage
+ ac_sz = strlen(iter_sugg->suggestion);
+ memcpy( ac_str+cnt_sz, iter_sugg->suggestion, ac_sz);
+ cnt_sz += ac_sz;
+ ac_str[cnt_sz] = ' ';
+ cnt_sz += 1;
+ }
+ ac_str[cnt_sz] = '\0';
+ ret = ac_str;
+ }
+ cmd_acq_free( ac );
+ }
+
+ cmd_tok_destroy( ptr->next );
+ ptr->next = NULL;
+ cmd_arg_destroy( args );
+
+ return ret;
+}
+
+int cmd_mng_exec( cmd_mng_t *cmng, const char *cmd, size_t sz_cmd )
+{
+ int ret = CMD_EOK;
+ int fret = 0;
+ cmd_tok_t tl, *ptr_tl = &tl, *iter = NULL;
+ cmd_arg_t *args = NULL;
+
+ // Init values
+ memset( &tl, 0, sizeof( cmd_tok_t ));
+
+ fret = parse_cmd( ptr_tl, cmd, sz_cmd );
+ if ( fret != 0 )
+ {
+ ret = CMD_EEXE;
+ goto error_exe; //if err memleak from parse_cmd?
+ }
+
+ iter = ptr_tl->next;
+ args = cmd_arg_create( iter );
+ cmd_tok_destroy( ptr_tl->next );
+ ptr_tl->next = NULL;
+
+ if (cmd_exec(cmng->table, args) != 0)
+ {
+ ret = CMD_ECMD;
+ goto error_cmd;
+ }
+
+ /* if history is on then manage commands */
+ if (cmng->flag_history)
+ {
+ /*replace with proper datatype in future*/
+ char *p = malloc(sz_cmd);
+ int idx = (cmng->history_size)%CMD_HISTORY_SIZE;
+ memcpy(p,cmd,sz_cmd);
+ if (cmng->history[idx]!=NULL) free(cmng->history[idx]);
+ cmng->history[idx] = p;
+ cmng->history_size += 1; //one day there could be overflow after 2^31/2^63 cmds, good luck with this bug
+ }
+
+ cmd_arg_destroy( args );
+
+ return ret;
+error_cmd:
+ cmd_arg_destroy( args );
+
+error_exe:
+
+ return ret;
+}
+
+int cmd_mng_free( cmd_mng_t *cmng)
+{
+ int ret=0;
+ int i;
+
+ for (i=0;i<CMD_HISTORY_SIZE;i++)
+ {
+ if (cmng->history[i])
+ {
+ free(cmng->history[i]);
+ cmng->history[i] = NULL;
+ }
+ }
+
+ return ret;
+}
+
/*
Clothest match function
AA AB = (1) equile <100%
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)))
diff --git a/libcmd/cmd_parse.c b/libcmd/cmd_parse.c
index 84ec41a..b9904e9 100644
--- a/libcmd/cmd_parse.c
+++ b/libcmd/cmd_parse.c
@@ -7,8 +7,8 @@
#define TADD(T,S,E,SZ) {cmd_tok_t *t=cmd_tok_create(S,E,SZ,T);cmd_tok_add(tl,t);tl=tl->next;}
//#define TADD(T,S,E)
-//#define PR_TK_DBG(S) printf(S);fwrite(ts,1,te-ts,stdout);printf("\n");
-#define PR_TK_DBG(S) ;
+#define PR_TK_DBG(S) printf(S);fwrite(ts,1,te-ts,stdout);printf("\n");
+//#define PR_TK_DBG(S) ;
char *new_string( const char *start, const char *end )
{
@@ -32,103 +32,108 @@ int print_token( char *s, char *e, int tok)
#line 34 "cmd_parse.c"
static const char _cmd_actions[] = {
- 0, 1, 0, 1, 1, 1, 2, 1,
- 3, 1, 4, 1, 5, 1, 6, 1,
- 7, 1, 8, 1, 9, 1, 10
+ 0, 1, 2, 1, 5, 1, 6, 1,
+ 7, 1, 8, 1, 9, 1, 10, 1,
+ 11, 1, 12, 1, 13, 2, 0, 1,
+ 2, 3, 4
};
static const char _cmd_key_offsets[] = {
- 0, 0, 8, 17, 19, 25, 37, 40,
- 44, 46, 48, 54
+ 0, 0, 3, 6, 8, 10, 16, 30,
+ 32, 37, 40, 42, 48
};
static const char _cmd_trans_keys[] = {
- 32, 39, 48, 57, 65, 90, 97, 122,
- 32, 34, 39, 48, 57, 65, 90, 97,
- 122, 48, 49, 48, 57, 65, 70, 97,
- 102, 32, 34, 48, 59, 9, 10, 49,
- 57, 65, 90, 97, 122, 32, 9, 10,
- 98, 120, 48, 57, 48, 57, 48, 49,
- 48, 57, 65, 70, 97, 102, 48, 57,
- 65, 90, 97, 122, 0
+ 34, 39, 92, 32, 34, 92, 48, 57,
+ 48, 49, 48, 57, 65, 70, 97, 102,
+ 32, 34, 39, 44, 46, 48, 9, 10,
+ 49, 57, 65, 90, 97, 122, 48, 57,
+ 46, 98, 120, 48, 57, 46, 48, 57,
+ 48, 49, 48, 57, 65, 70, 97, 102,
+ 48, 57, 65, 90, 97, 122, 0
};
static const char _cmd_single_lengths[] = {
- 0, 2, 3, 0, 0, 4, 1, 2,
- 0, 0, 0, 0
+ 0, 3, 3, 0, 0, 0, 6, 0,
+ 3, 1, 0, 0, 0
};
static const char _cmd_range_lengths[] = {
- 0, 3, 3, 1, 3, 4, 1, 1,
- 1, 1, 3, 3
+ 0, 0, 0, 1, 1, 3, 4, 1,
+ 1, 1, 1, 3, 3
};
static const char _cmd_index_offsets[] = {
- 0, 0, 6, 13, 15, 19, 28, 31,
- 35, 37, 39, 43
+ 0, 0, 4, 8, 10, 12, 16, 27,
+ 29, 34, 37, 39, 43
};
static const char _cmd_indicies[] = {
- 0, 0, 0, 0, 0, 1, 0, 2,
- 0, 0, 0, 0, 1, 4, 3, 5,
- 5, 5, 3, 6, 7, 8, 10, 6,
- 9, 11, 11, 1, 6, 6, 12, 14,
- 15, 9, 13, 9, 13, 4, 16, 5,
- 5, 5, 17, 11, 11, 11, 18, 0
+ 1, 2, 3, 0, 0, 0, 0, 2,
+ 5, 4, 7, 6, 8, 8, 8, 6,
+ 9, 0, 9, 9, 10, 11, 9, 12,
+ 13, 13, 2, 5, 14, 10, 16, 17,
+ 12, 15, 10, 12, 15, 7, 18, 8,
+ 8, 8, 19, 13, 13, 13, 20, 0
};
static const char _cmd_trans_targs[] = {
- 2, 0, 5, 5, 9, 10, 6, 1,
- 7, 8, 5, 11, 5, 5, 3, 4,
- 5, 5, 5
+ 1, 6, 0, 2, 6, 7, 6, 10,
+ 11, 6, 3, 8, 9, 12, 6, 6,
+ 4, 5, 6, 6, 6
};
static const char _cmd_trans_actions[] = {
- 0, 0, 7, 21, 0, 0, 0, 0,
- 5, 0, 9, 0, 13, 15, 0, 0,
- 17, 11, 19
+ 0, 3, 0, 0, 19, 0, 17, 0,
+ 0, 5, 0, 24, 24, 0, 15, 9,
+ 0, 0, 11, 7, 13
};
static const char _cmd_to_state_actions[] = {
- 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 21, 0,
+ 0, 0, 0, 0, 0
};
static const char _cmd_from_state_actions[] = {
- 0, 0, 0, 0, 0, 3, 0, 0,
- 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0
};
static const char _cmd_eof_trans[] = {
- 0, 0, 0, 4, 4, 0, 13, 14,
- 14, 17, 18, 19
+ 0, 0, 0, 5, 7, 7, 0, 15,
+ 16, 16, 19, 20, 21
};
-static const int cmd_start = 5;
-static const int cmd_first_final = 5;
+static const int cmd_start = 6;
+static const int cmd_first_final = 6;
static const int cmd_error = 0;
-static const int cmd_en_main = 5;
+static const int cmd_en_main = 6;
-#line 56 "cmd_parse.ragel"
+#line 75 "cmd_parse.ragel"
-int parse_cmd( cmd_tok_t *tl, const char *str )
+int parse_cmd( cmd_tok_t *tl, const char *str, size_t str_size )
{
static uint8_t cs;
const int stacksize = 10;
- int res=0, *stack=NULL, act=0;
+ int res=0, *stack=NULL, act=0,top=0;
stack = malloc( sizeof(stack)*stacksize );
- char *p=(char *)str, *pe = (char *)str + strlen( str ), *eof=NULL;
+ char *p=(char *)str, *pe = (char *)str + str_size, *eof=pe;
char *ts, *te = 0;
+ /*save for cmd_begin state*/
+ //char *ts_cb=0, *te_cb=0;
+
+ printf("PE:%s %02x\n",pe,(unsigned char)*pe);
+
/*
variables used in state machine
*/
-#line 132 "cmd_parse.c"
+#line 137 "cmd_parse.c"
{
cs = cmd_start;
ts = 0;
@@ -136,9 +141,9 @@ int parse_cmd( cmd_tok_t *tl, const char *str )
act = 0;
}
-#line 72 "cmd_parse.ragel"
+#line 96 "cmd_parse.ragel"
-#line 142 "cmd_parse.c"
+#line 147 "cmd_parse.c"
{
int _klen;
unsigned int _trans;
@@ -155,11 +160,11 @@ _resume:
_nacts = (unsigned int) *_acts++;
while ( _nacts-- > 0 ) {
switch ( *_acts++ ) {
- case 1:
+ case 2:
#line 1 "NONE"
{ts = p;}
break;
-#line 163 "cmd_parse.c"
+#line 168 "cmd_parse.c"
}
}
@@ -225,43 +230,59 @@ _eof_trans:
{
switch ( *_acts++ )
{
- case 2:
+ case 3:
#line 1 "NONE"
{te = p+1;}
break;
- case 3:
-#line 46 "cmd_parse.ragel"
- {te = p+1;{PR_TK_DBG("str = ");TADD(CMDT_STR, ts,te,te-ts);}}
- break;
case 4:
-#line 49 "cmd_parse.ragel"
- {te = p+1;{PR_TK_DBG("sep = ");TADD(CMDT_SP, ts,te,te-ts);}}
+#line 60 "cmd_parse.ragel"
+ {act = 2;}
break;
case 5:
-#line 44 "cmd_parse.ragel"
- {te = p;p--;{PR_TK_DBG("hex = ");TADD(CMDT_HEX, ts,te,te-ts);}}
+#line 62 "cmd_parse.ragel"
+ {te = p+1;{PR_TK_DBG("qstr = ");TADD(CMDT_QSTR, ts,te,te-ts);}}
break;
case 6:
-#line 45 "cmd_parse.ragel"
- {te = p;p--;{PR_TK_DBG("sp = ");}}
+#line 64 "cmd_parse.ragel"
+ {te = p+1;{PR_TK_DBG("sp = ");TADD(CMDT_SP, ts,te,te-ts);}}
break;
case 7:
-#line 47 "cmd_parse.ragel"
- {te = p;p--;{PR_TK_DBG("dec = ");TADD(CMDT_INT, ts,te,te-ts);}}
+#line 59 "cmd_parse.ragel"
+ {te = p;p--;{PR_TK_DBG("hex = ");TADD(CMDT_HEX, ts,te,te-ts);}}
break;
case 8:
-#line 48 "cmd_parse.ragel"
- {te = p;p--;{PR_TK_DBG("bin = ");TADD(CMDT_BIN, ts,te,te-ts);}}
+#line 60 "cmd_parse.ragel"
+ {te = p;p--;{PR_TK_DBG("dec = ");TADD(CMDT_INT, ts,te,te-ts);}}
break;
case 9:
-#line 50 "cmd_parse.ragel"
- {te = p;p--;{PR_TK_DBG("wrd = ");TADD(CMDT_WORD,ts,te,te-ts);}}
+#line 61 "cmd_parse.ragel"
+ {te = p;p--;{PR_TK_DBG("bin = ");TADD(CMDT_BIN, ts,te,te-ts);}}
break;
case 10:
-#line 47 "cmd_parse.ragel"
- {{p = ((te))-1;}{PR_TK_DBG("dec = ");TADD(CMDT_INT, ts,te,te-ts);}}
+#line 63 "cmd_parse.ragel"
+ {te = p;p--;{PR_TK_DBG("word = ");TADD(CMDT_WORD, ts,te,te-ts);}}
+ break;
+ case 11:
+#line 66 "cmd_parse.ragel"
+ {te = p;p--;{PR_TK_DBG("float= ");TADD(CMDT_FLOAT, ts,te,te-ts);}}
break;
-#line 265 "cmd_parse.c"
+ case 12:
+#line 60 "cmd_parse.ragel"
+ {{p = ((te))-1;}{PR_TK_DBG("dec = ");TADD(CMDT_INT, ts,te,te-ts);}}
+ break;
+ case 13:
+#line 1 "NONE"
+ { switch( act ) {
+ case 0:
+ {{cs = 0;goto _again;}}
+ break;
+ case 2:
+ {{p = ((te))-1;}PR_TK_DBG("dec = ");TADD(CMDT_INT, ts,te,te-ts);}
+ break;
+ }
+ }
+ break;
+#line 286 "cmd_parse.c"
}
}
@@ -274,7 +295,11 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 278 "cmd_parse.c"
+ case 1:
+#line 1 "NONE"
+ {act = 0;}
+ break;
+#line 303 "cmd_parse.c"
}
}
@@ -294,11 +319,11 @@ _again:
_out: {}
}
-#line 73 "cmd_parse.ragel"
+#line 97 "cmd_parse.ragel"
if ( cs == cmd_error )
{
- printf("CLIPARSE ERR state [%d] pos[%d]:[%s]\n", res, p-str, p);
+ printf("CLIPARSE ERR state [%d] pos[%ld]:[%s]\n", res, p-str, p);
res = -1;
}
diff --git a/libcmd/cmd_parse.h b/libcmd/cmd_parse.h
index 88a02e8..2976f6d 100644
--- a/libcmd/cmd_parse.h
+++ b/libcmd/cmd_parse.h
@@ -5,4 +5,4 @@
#include "cmd.h"
-int parse_cmd( cmd_tok_t *tl, const char *str ); \ No newline at end of file
+int parse_cmd( cmd_tok_t *tl, const char *str, size_t sz_cmd ); \ No newline at end of file
diff --git a/libcmd/cmd_parse.ragel b/libcmd/cmd_parse.ragel
index dd5ff13..482ad8d 100644
--- a/libcmd/cmd_parse.ragel
+++ b/libcmd/cmd_parse.ragel
@@ -5,8 +5,8 @@
#define TADD(T,S,E,SZ) {cmd_tok_t *t=cmd_tok_create(S,E,SZ,T);cmd_tok_add(tl,t);tl=tl->next;}
//#define TADD(T,S,E)
-//#define PR_TK_DBG(S) printf(S);fwrite(ts,1,te-ts,stdout);printf("\n");
-#define PR_TK_DBG(S) ;
+#define PR_TK_DBG(S) printf(S);fwrite(ts,1,te-ts,stdout);printf("\n");
+//#define PR_TK_DBG(S) ;
char *new_string( const char *start, const char *end )
{
@@ -30,40 +30,51 @@ int print_token( char *s, char *e, int tok)
%%{
machine cmd;
-
- hex = '0x' [a-fA-F0-9]+;
- decimal = [0-9]+;
- binary = '0b' [0-1]+;
- string = ('"' ([a-zA-Z0-9' '])+ '"');
- seperate = ';';
- word = [a-zA-Z] ([a-zA-Z0-9])*;
-
- sp = (' ' | '\t' | '\n')*;
+ hex = '0x' [a-fA-F0-9]+;
+ decimal = [0-9]+;
+ binary = '0b' [0-1]+;
+ float = [0-9]* '.' [0-9]+;
+ quoted_string = '"'
+ (
+ ' '
+ |(any-['\\' '"' ' '])+
+ |'\\\\'
+ |'\\\"'
+ |'\\ '
+ )*
+ '"';
+ quote = '"' (any-'"')* '"';
+ #seperate = ';';
+ word = [a-zA-Z] ([a-zA-Z0-9])*;
+ sp = ([' ','\t','\n']);
main := |*
- hex {PR_TK_DBG("hex = ");TADD(CMDT_HEX, ts,te,te-ts);};
- sp {PR_TK_DBG("sp = ");};
- string {PR_TK_DBG("str = ");TADD(CMDT_STR, ts,te,te-ts);};
- decimal {PR_TK_DBG("dec = ");TADD(CMDT_INT, ts,te,te-ts);};
- binary {PR_TK_DBG("bin = ");TADD(CMDT_BIN, ts,te,te-ts);};
- seperate {PR_TK_DBG("sep = ");TADD(CMDT_SP, ts,te,te-ts);};
- word {PR_TK_DBG("wrd = ");TADD(CMDT_WORD,ts,te,te-ts);};
+ hex {PR_TK_DBG("hex = ");TADD(CMDT_HEX, ts,te,te-ts);};
+ decimal {PR_TK_DBG("dec = ");TADD(CMDT_INT, ts,te,te-ts);};
+ binary {PR_TK_DBG("bin = ");TADD(CMDT_BIN, ts,te,te-ts);};
+ quoted_string {PR_TK_DBG("qstr = ");TADD(CMDT_QSTR, ts,te,te-ts);};
+ word {PR_TK_DBG("word = ");TADD(CMDT_WORD, ts,te,te-ts);};
+ sp {PR_TK_DBG("sp = ");TADD(CMDT_SP, ts,te,te-ts);};
+ float {PR_TK_DBG("float= ");TADD(CMDT_FLOAT, ts,te,te-ts);};
*|;
- #main := lang;
-
write data;
}%%
-int parse_cmd( cmd_tok_t *tl, const char *str )
+int parse_cmd( cmd_tok_t *tl, const char *str, size_t str_size )
{
static uint8_t cs;
const int stacksize = 10;
- int res=0, *stack=NULL, act=0;
+ int res=0, *stack=NULL, act=0,top=0;
stack = malloc( sizeof(stack)*stacksize );
- char *p=(char *)str, *pe = (char *)str + strlen( str ), *eof=NULL;
+ char *p=(char *)str, *pe = (char *)str + str_size, *eof=pe;
char *ts, *te = 0;
+ /*save for cmd_begin state*/
+ //char *ts_cb=0, *te_cb=0;
+
+ printf("PE:%s %02x\n",pe,(unsigned char)*pe);
+
/*
variables used in state machine
*/
@@ -73,7 +84,7 @@ int parse_cmd( cmd_tok_t *tl, const char *str )
if ( cs == cmd_error )
{
- printf("CLIPARSE ERR state [%d] pos[%d]:[%s]\n", res, p-str, p);
+ printf("CLIPARSE ERR state [%d] pos[%ld]:[%s]\n", res, p-str, p);
res = -1;
}