diff options
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/cmd_blk.c | 3 | ||||
| -rw-r--r-- | cmd/cmd_dumpx.c | 2 | ||||
| -rw-r--r-- | cmd/cmd_seek.c | 71 | 
3 files changed, 73 insertions, 3 deletions
| diff --git a/cmd/cmd_blk.c b/cmd/cmd_blk.c index a568f98..b849026 100644 --- a/cmd/cmd_blk.c +++ b/cmd/cmd_blk.c @@ -24,7 +24,10 @@ int c_blk( cmd_arg_t *arg )  	} else if ( argc == 1 )  	{  		if ((type[0] == CMDT_INT) || (type[0] == CMDT_HEX)) +		{  			g_file->blk_size = atoi( argv[0] ); +			g_buf->realloc(g_file->blk_size); +		}  	} else  	{  		return -1; diff --git a/cmd/cmd_dumpx.c b/cmd/cmd_dumpx.c index 1181200..f6448f5 100644 --- a/cmd/cmd_dumpx.c +++ b/cmd/cmd_dumpx.c @@ -28,7 +28,7 @@ int c_dumpx( cmd_arg_t *arg )  			if ( j<g_buf->cursize() )  			{  				char c; -				g_buf->getc(j,&c); +				g_buf->getc(j, &c);  				printf("%02x ",(unsigned char)c);  			} else  			{ diff --git a/cmd/cmd_seek.c b/cmd/cmd_seek.c index d8bb768..2aa0310 100644 --- a/cmd/cmd_seek.c +++ b/cmd/cmd_seek.c @@ -8,11 +8,39 @@ extern file_t *g_file;  extern Buf *g_buf;  extern int g_flags; +int if_decimal(char *s, int sz) +{ +	int i=0; +	while (i<sz) +	{ +		//printf("%d\n",i); +		if (!isdigit(s[i])) +			return 0; +		i++; +	} +	return 1; +} + +int if_hex(char *s, int sz) +{ +	int i=0; +	while (i<sz) +	{ +		//printf("%d\n",i); +		if (!isxdigit(s[i])) +			return 0; +		i++; +	} +	return 1; +} +  int c_seek(  cmd_arg_t *arg  )  {  	int fret;  	int argc = arg->argc;  	char **argv = arg->argv; +	int *type = arg->type; +	int checktype;  	off_t offset;  	int off_type = 0; //-1 seek down, 0 set pos, +1 seek up @@ -28,7 +56,6 @@ int c_seek(  cmd_arg_t *arg  )  		return -1;  	} -	//set seek type  	switch( argv[0][0] )  	{  	case '+': @@ -41,14 +68,54 @@ int c_seek(  cmd_arg_t *arg  )  		off_type = 0;  	} -	offset = atoi( argv[0] ); //!fix that to strtol at least +	//printf("Type %d\n",type[0]); +	checktype = type[0]; +	if (checktype == CMDT_WORD) +	{ +		if (if_decimal(argv[0]+1,strlen(argv[0])-1)) +		{ +			checktype = CMDT_INT; +		} else if (if_hex(argv[0]+3,strlen(argv[0])-3)) +		{ +			checktype = CMDT_HEX; +		} +	} + + +	//check argument type and convert to offset +	if (checktype == CMDT_INT) +	{ +		if (off_type != 0) +		{ +			offset = atoi( argv[0] ); //!fix that to strtol at least +		} else  +		{ +			offset = atoi( argv[0] ); +		} +	} else if (checktype == CMDT_HEX) +	{ +		if (off_type != 0) +		{ +			offset = strtol( argv[0], NULL, 16); +		} else  +		{ +			offset = strtol( argv[0]+3, NULL, 16); +		} +	} else +	{ +		//unsupported argument do nothing +		return 0; +	} +	  	if (off_type == 0)  	{  		//g_file offset maybe wrong +		//printf("seekp\n");  		fret = file_seekp( g_file, offset );  	} else  	{ +		//printf("seek\n");  		fret = file_seek( g_file, offset );  	}  	if ( fret < 0 ) | 
