From 786bd1e76c6806a4c9272814f9ffe7d901998e4e Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Sun, 6 Oct 2019 14:36:17 +0100 Subject: Fix seek command, tested/works relative seek, and hex positioning support --- cmd/cmd_seek.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) (limited to 'cmd/cmd_seek.c') 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 (iargc; 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 ) -- cgit v1.2.3