diff options
author | 2024-01-07 06:32:57 -0800 | |
---|---|---|
committer | 2024-01-07 09:32:57 -0500 | |
commit | 729381ec7c2fe8a079f40ce3863b4198a9581dc0 (patch) | |
tree | 812bae8b66d2a490a02d727d2ec372b3ad13e441 /src/tools/unidasm.cpp | |
parent | 8986d48306eeacff191c649fa321df4105765695 (diff) |
unidasm: Allow -count to be specified in hexadecimal or octal. (#11912)
Diffstat (limited to 'src/tools/unidasm.cpp')
-rw-r--r-- | src/tools/unidasm.cpp | 50 |
1 files changed, 21 insertions, 29 deletions
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp index d84393be307..50c5e5ba7e8 100644 --- a/src/tools/unidasm.cpp +++ b/src/tools/unidasm.cpp @@ -1147,6 +1147,24 @@ void unidasm_data_buffer::decrypt(const unidasm_data_buffer &buffer, bool opcode abort(); } +static int parse_number(const char *curarg, const char *default_format, u32 *value) +{ + int result; + if(curarg[0] == '0') { + if(tolower((uint8_t)curarg[1]) == 'x') + result = sscanf(&curarg[2], "%x", value); + else if(tolower((uint8_t)curarg[1]) == 'o') + result = sscanf(&curarg[2], "%o", value); + else + result = sscanf(&curarg[1], "%o", value); + } + else if(curarg[0] == '$') + result = sscanf(&curarg[1], "%x", value); + else + result = sscanf(&curarg[0], default_format, value); + return result; +} + static int parse_options(int argc, char *argv[], options *opts) { bool pending_base = false; @@ -1190,20 +1208,7 @@ static int parse_options(int argc, char *argv[], options *opts) } else if(pending_base) { // base PC - int result; - if(curarg[0] == '0') { - if(tolower((uint8_t)curarg[1]) == 'x') - result = sscanf(&curarg[2], "%x", &opts->basepc); - else if(tolower((uint8_t)curarg[1]) == 'o') - result = sscanf(&curarg[2], "%o", &opts->basepc); - else - result = sscanf(&curarg[1], "%o", &opts->basepc); - } - else if(curarg[0] == '$') - result = sscanf(&curarg[1], "%x", &opts->basepc); - else - result = sscanf(&curarg[0], "%x", &opts->basepc); - if(result != 1) + if(parse_number(curarg, "%x", &opts->basepc) != 1) goto usage; pending_base = false; @@ -1220,26 +1225,13 @@ static int parse_options(int argc, char *argv[], options *opts) } else if(pending_skip) { // skip bytes - int result; - if(curarg[0] == '0') { - if(tolower((uint8_t)curarg[1]) == 'x') - result = sscanf(&curarg[2], "%x", &opts->skip); - else if(tolower((uint8_t)curarg[1]) == 'o') - result = sscanf(&curarg[2], "%o", &opts->skip); - else - result = sscanf(&curarg[1], "%o", &opts->skip); - } - else if(curarg[0] == '$') - result = sscanf(&curarg[1], "%x", &opts->skip); - else - result = sscanf(curarg, "%d", &opts->skip); - if(result != 1) + if(parse_number(curarg, "%d", &opts->skip) != 1) goto usage; pending_skip = false; } else if(pending_count) { // size - if(sscanf(curarg, "%d", &opts->count) != 1) + if(parse_number(curarg, "%d", &opts->count) != 1) goto usage; pending_count = false; |