]> git.draconx.ca Git - slotifier.git/commitdiff
Use new packed option format from gen-options.awk.
authorNick Bowler <nbowler@draconx.ca>
Sun, 8 Jan 2023 19:47:47 +0000 (14:47 -0500)
committerNick Bowler <nbowler@draconx.ca>
Sun, 8 Jan 2023 20:10:55 +0000 (15:10 -0500)
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
common
src/slotifier.c

index 28bdd17fdddef8cc3694426652901433a4e633f0..b0736580b740d99787b00c766430cf35f370aa6f 100644 (file)
@@ -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 6bba07ea3a95f69fcb47457dde0970a72eecbcee..e599119f0492b01f1f21a8cce8d695c314dab3b1 160000 (submodule)
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit 6bba07ea3a95f69fcb47457dde0970a72eecbcee
+Subproject commit e599119f0492b01f1f21a8cce8d695c314dab3b1
index 57183864af4a5c1550d3f81b50d14b14e9e5c380..312f9f688827b1d495000f5dfe08f1a2e605ba6b 100644 (file)
@@ -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 <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdint.h>
 #include <assert.h>
 #include <locale.h>
 
@@ -32,7 +33,9 @@
 #include <CNearTree.h>
 #include <gerbv.h>
 
+#include "options.h"
 #include "help.h"
+#include "xtra.h"
 
 #if !ENABLE_NLS
 #  undef ENABLE_NLS
 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();