diff options
Diffstat (limited to 'cmd/cmd_seek.c')
-rw-r--r-- | cmd/cmd_seek.c | 71 |
1 files changed, 69 insertions, 2 deletions
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 ) |