diff options
author | Cyril Bur <cyrilbur@gmail.com> | 2018-02-09 15:38:33 +1100 |
---|---|---|
committer | Alistair Popple <alistair@popple.id.au> | 2018-02-12 14:50:47 +1100 |
commit | 9367b72880bdc88a0e74e651f206554911236ae8 (patch) | |
tree | 0147e3f13f037110cf5ba1ed3d8ec51296bd9b3d | |
parent | 2e38da09f9dab6532e25e9bacc117cb2d7ebcda9 (diff) | |
download | pdbg-9367b72880bdc88a0e74e651f206554911236ae8.tar.gz pdbg-9367b72880bdc88a0e74e651f206554911236ae8.zip |
main: Pull out command parsing from option parsing
Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
-rw-r--r-- | src/main.c | 49 |
1 files changed, 33 insertions, 16 deletions
@@ -235,7 +235,7 @@ enum command parse_cmd(char *optarg) static bool parse_options(int argc, char *argv[]) { - int c, cmd_arg_idx = 0; + int c; bool opt_error = true; static int current_processor = INT_MAX, current_chip = INT_MAX, current_thread = INT_MAX; struct option long_opts[] = { @@ -253,22 +253,11 @@ static bool parse_options(int argc, char *argv[]) char *endptr; do { - c = getopt_long(argc, argv, "-ab:c:d:hp:s:t:V", long_opts, NULL); - switch(c) { - case 1: - /* Positional argument */ - if (!cmd) - opt_error = !parse_cmd(optarg); - else if (cmd_arg_idx >= MAX_CMD_ARGS || - (cmd && cmd_arg_idx >= cmd_max_arg_count)) - opt_error = true; - else { - errno = 0; - cmd_args[cmd_arg_idx++] = strtoull(optarg, &endptr, 0); - opt_error = (errno || *endptr != '\0'); - } + c = getopt_long(argc, argv, "+ab:c:d:hp:s:t:V", long_opts, NULL); + if (c == -1) break; + switch(c) { case 'a': opt_error = false; for (current_processor = 0; current_processor < MAX_PROCESSORS; current_processor++) { @@ -360,12 +349,37 @@ static bool parse_options(int argc, char *argv[]) } } while (c != EOF && !opt_error); + if (opt_error) + print_usage(argv[0]); + + return opt_error; +} + +static bool parse_command(int argc, char *argv[]) +{ + int cmd_arg_idx = 0, i = optind; + bool opt_error = true; + char *endptr; + + + opt_error = i == argc || !parse_cmd(argv[i]); + i++; + while (i < argc && !opt_error) { + if (cmd_arg_idx >= MAX_CMD_ARGS || + (cmd && cmd_arg_idx >= cmd_max_arg_count)) + opt_error = true; + else { + errno = 0; + cmd_args[cmd_arg_idx++] = strtoull(argv[i], &endptr, 0); + opt_error = (errno || *endptr != '\0'); + } + i++; + } opt_error |= cmd_arg_idx < cmd_min_arg_count; if (opt_error) print_usage(argv[0]); cmd_arg_count = cmd_arg_idx; - return opt_error; } @@ -991,6 +1005,9 @@ int main(int argc, char *argv[]) pdbg_target_probe(); + if (parse_command(argc, argv)) + return -1; + switch(cmd) { case GETCFAM: rc = for_each_target("fsi", getcfam, &cmd_args[0], NULL); |