From 4dd9ed36e29f68507bd1038752314165587a94dd Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Mon, 9 Jan 2023 20:20:19 -0500 Subject: [PATCH] Don't parse command-line options more than once. Instead of parsing the options a second time to collect the --execute option arguments, we can easily permute the argv array on the first pass through, which simplifies the subsequent evaluation. --- src/cdecl99.c | 24 +++++++++++------------- tests/general.at | 13 ++++++++++++- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/cdecl99.c b/src/cdecl99.c index 9d9fcc8..fc9d3b2 100644 --- a/src/cdecl99.c +++ b/src/cdecl99.c @@ -1,6 +1,6 @@ /* * Command line utility for making sense of C declarations. - * Copyright © 2011-2012, 2020-2022 Nick Bowler + * Copyright © 2011-2012, 2020-2023 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -75,7 +75,7 @@ static void print_version(void) } puts(PACKAGE_STRING); - printf("Copyright %s 2022 Nick Bowler.\n", copysign); + printf("Copyright %s 2023 Nick Bowler.\n", copysign); puts("License GPLv3+: GNU GPL version 3 or any later version."); puts("This is free software: you are free to change and redistribute it."); puts("There is NO WARRANTY, to the extent permitted by law."); @@ -148,16 +148,13 @@ static int repl(void) return 0; } -static int repl_cmdline(int argc, char **argv) +static int repl_cmdline(unsigned count, char **commands) { - int opt, rc, ret = 0; + int ret = 0; + unsigned i; - optind = 1; - while ((opt = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) { - if (opt != 'e') - continue; - - rc = run_command(optarg, false); + for (i = 0; i < count; i++) { + int rc = run_command(commands[i], false); if (rc < 0) ret = -1; else if (rc > 0) @@ -209,8 +206,9 @@ static void init_i18n(void) int main(int argc, char **argv) { - bool show_intro = true, execute = false; + bool show_intro = true; const char *filename = NULL; + unsigned execute = 0; int i, opt, rc; if (argc > 0) @@ -233,7 +231,7 @@ int main(int argc, char **argv) filename = optarg; break; case 'e': - execute = true; + argv[execute++] = optarg; break; case 'V': print_version(); @@ -278,7 +276,7 @@ int main(int argc, char **argv) if (interactive) rc = repl(); else if (execute) - rc = repl_cmdline(argc, argv); + rc = repl_cmdline(execute, argv); else rc = repl_noninteractive(); diff --git a/tests/general.at b/tests/general.at index 38493ce..b5a623d 100644 --- a/tests/general.at +++ b/tests/general.at @@ -1,4 +1,4 @@ -# Copyright © 2012, 2020 Nick Bowler +# Copyright © 2012, 2020-2021, 2023 Nick Bowler # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -72,3 +72,14 @@ AT_CHECK([sed -n '$p' stdout], [0], [type int ]) AT_CLEANUP + +AT_SETUP([cdecl99 --execute option]) + +AT_CHECK([cdecl99 --execute 'explain int' --execute='declare x as int' \ + --execute='simplify int (x)()'], [0], +[[type int +int x +int x() +]]) + +AT_CLEANUP -- 2.43.2