diff options
author | FreeArtMan <dos21h@gmail.com> | 2019-10-06 14:36:17 +0100 |
---|---|---|
committer | FreeArtMan <dos21h@gmail.com> | 2019-10-06 14:36:17 +0100 |
commit | 786bd1e76c6806a4c9272814f9ffe7d901998e4e (patch) | |
tree | 8b1e38e48a766c5a8dbad7f00ffb63d09376426c /cmd | |
parent | 8a8e0941dd2ab5f089662362a30c91e16de18ce0 (diff) | |
download | ihe-786bd1e76c6806a4c9272814f9ffe7d901998e4e.tar.gz ihe-786bd1e76c6806a4c9272814f9ffe7d901998e4e.zip |
Fix seek command, tested/works relative seek, and hex positioning support
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 ) |