diff options
| -rw-r--r-- | libcmd/Makefile | 2 | ||||
| -rw-r--r-- | libcmd/cmd.c | 199 | ||||
| -rw-r--r-- | libcmd/cmd.h | 97 | ||||
| -rw-r--r-- | libcmd/cmd_parse.c | 173 | ||||
| -rw-r--r-- | libcmd/cmd_parse.h | 2 | ||||
| -rw-r--r-- | 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;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;  	} | 
