summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyril Bur <cyrilbur@gmail.com>2018-02-09 15:38:33 +1100
committerAlistair Popple <alistair@popple.id.au>2018-02-12 14:50:47 +1100
commit9367b72880bdc88a0e74e651f206554911236ae8 (patch)
tree0147e3f13f037110cf5ba1ed3d8ec51296bd9b3d
parent2e38da09f9dab6532e25e9bacc117cb2d7ebcda9 (diff)
downloadpdbg-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.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/src/main.c b/src/main.c
index f35057a..0967320 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
OpenPOWER on IntegriCloud