From fd8a16dfd20096092538d58ea7842469ad685e75 Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Sat, 17 Aug 2019 13:01:43 +0100 Subject: Update libcmd --- libcmd/Makefile | 2 +- libcmd/cmd.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++--- libcmd/cmd.h | 97 +++++++++++++++++++++++- libcmd/cmd_parse.c | 173 ++++++++++++++++++++++++------------------ libcmd/cmd_parse.h | 2 +- libcmd/cmd_parse.ragel | 59 +++++++++------ 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;ihistory[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 "" +*/ 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; } -- cgit v1.2.3