From e89bebee19d3c919f3d501999fc38867cdcd2b00 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sun, 8 Jan 2023 14:47:47 -0500 Subject: [PATCH] Use new packed option format from gen-options.awk. This new format uses a compact, fully constant array to generate the real struct option array at runtime. This allows the full-sized array to be dropped after command-line processing is finished, and with position-independent executables, reduces the amount of relocation processing needed. --- Makefile.am | 6 ++--- common | 2 +- src/slotifier.c | 58 +++++++++++++++++++++++++++++-------------------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/Makefile.am b/Makefile.am index 28bdd17..b073658 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -# Copyright © 2018, 2021 Nick Bowler +# Copyright © 2018, 2021, 2023 Nick Bowler # # License WTFPL2: Do What The Fuck You Want To Public License, version 2. # This is free software: you are free to do what the fuck you want to. @@ -20,8 +20,8 @@ AM_CFLAGS = $(LIBGERBV_CFLAGS) $(CNEARTREE_CFLAGS) bin_PROGRAMS = slotifier -slotifier_SOURCES = src/slotifier.c src/options.h \ - common/src/help.c common/src/help.h +noinst_HEADERS = common/src/help.h common/src/xtra.h +slotifier_SOURCES = src/slotifier.c src/options.h common/src/help.c slotifier_LDADD = $(LIBGERBV_LIBS) $(CNEARTREE_LIBS) libgnu.a \ $(LTLIBICONV) $(LTLIBINTL) $(HYPOT_LIBM) $(slotifier_OBJECTS): $(gnulib_headers) diff --git a/common b/common index 6bba07e..e599119 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 6bba07ea3a95f69fcb47457dde0970a72eecbcee +Subproject commit e599119f0492b01f1f21a8cce8d695c314dab3b1 diff --git a/src/slotifier.c b/src/slotifier.c index 5718386..312f9f6 100644 --- a/src/slotifier.c +++ b/src/slotifier.c @@ -1,6 +1,6 @@ /* * Utility to convert overlapping Excellon drill hits into drill slots. - * Copyright © 2018, 2021 Nick Bowler + * Copyright © 2018, 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 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -32,7 +33,9 @@ #include #include +#include "options.h" #include "help.h" +#include "xtra.h" #if !ENABLE_NLS # undef ENABLE_NLS @@ -44,13 +47,6 @@ static const char *progname = "slotifier"; static unsigned verbose; -#include "options.h" -static const char sopts[] = SOPT_STRING; -static const struct option lopts[] = { - LOPTS_INITIALIZER, - {0} -}; - static void print_version(void) { const char *copysign = "(C)"; @@ -64,7 +60,7 @@ static void print_version(void) copysign = convsign; } - printf("Copyright %s 2021 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."); @@ -80,7 +76,7 @@ static void print_usage(FILE *f) progname); } -static void print_help(void) +static void print_help(const struct option *lopts) { const struct option *opt; @@ -397,35 +393,33 @@ err_free_tree: return ret; } -int main(int argc, char **argv) +static int do_cmdline(int argc, char **argv, const char **outfile) { - const char *outfile = "/dev/stdout"; - gerbv_project_t *gp; - gerbv_image_t *drill; - int opt, ret = 0; + const char *sopts = SOPT_STRING; + int opt; + + XTRA_PACKED_LOPTS(lopts); if (argc > 0) progname = argv[0]; - init_i18n(); - while ((opt = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) { switch (opt) { case 'o': - outfile = optarg; + *outfile = optarg; break; case 'v': verbose++; break; case 'V': print_version(); - return EXIT_SUCCESS; + return 1; case 'H': - print_help(); - return EXIT_SUCCESS; + print_help(lopts); + return 1; default: print_usage(stderr); - return EXIT_FAILURE; + return -1; } } @@ -433,14 +427,30 @@ int main(int argc, char **argv) fprintf(stderr, _("%s: error: must specify a filename\n"), progname); print_usage(stderr); - return EXIT_FAILURE; + return -1; } if (optind + 1 < argc) { fprintf(stderr, _("%s: error: excess command-line arguments\n"), progname); print_usage(stderr); - return EXIT_FAILURE; + return -1; + } + + return 0; +} + +int main(int argc, char **argv) +{ + const char *outfile = "/dev/stdout"; + gerbv_project_t *gp; + gerbv_image_t *drill; + int ret = 0; + + init_i18n(); + switch (do_cmdline(argc, argv, &outfile)) { + case -1: return EXIT_FAILURE; + case 1: return EXIT_SUCCESS; } gp = gerbv_create_project(); -- 2.43.2