bin_PROGRAMS = slotifier
-slotifier_SOURCES = src/slotifier.c
+slotifier_SOURCES = src/slotifier.c src/options.h
slotifier_LDADD = $(LIBGERBV_LIBS) $(CNEARTREE_LIBS) libgnu.a \
$(LTLIBICONV) $(LTLIBINTL) $(HYPOT_LIBM)
$(slotifier_OBJECTS): $(gnulib_headers)
+$(slotifier_OBJECTS): src/options.h
dist_man_MANS = doc/slotifier.1
echo ' *** Remember to update NEWS before preparing a release.'; \
$(TEST_DISTRIBUTION_OR_ERROR); } >&2
+OPTFILES = src/options.opt
+.opt.h:
+ $(AM_V_GEN) $(AWK) -f $(DX_BASEDIR)/scripts/gen-options.awk $< >$@.tmp
+ $(AM_V_at) mv -f $@.tmp $@
+$(OPTFILES:.opt=.h): $(DX_BASEDIR)/scripts/gen-options.awk
+MAINTAINERCLEANFILES += $(OPTFILES:.opt=.h)
+EXTRA_DIST += $(DX_BASEDIR)/scripts/gen-options.awk $(OPTFILES)
+
# Supporting rules for gettext.
include $(top_srcdir)/common/snippet/gettext.mk
noinst_DATA = $(MOFILES)
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stddef.h>
#include <string.h>
-#include <locale.h>
-#include <stdint.h>
#include <assert.h>
+#include <locale.h>
+
#include <getopt.h>
#include <gettext.h>
+#include <localcharset.h>
+#include <mbswidth.h>
+#include <striconv.h>
+
#include <CNearTree.h>
#include <gerbv.h>
-#include <striconv.h>
-#include <localcharset.h>
#if !ENABLE_NLS
# undef ENABLE_NLS
#define _(x) (gettext(x))
+static const char *progname = "slotifier";
static unsigned verbose;
-static const char *progname = "slotifier";
-static const char sopts[] = "o:vVH";
+#include "options.h"
+static const char sopts[] = SOPT_STRING;
static const struct option lopts[] = {
- { "output", 1, NULL, 'o' },
- { "verbose", 0, NULL, 'v' },
- { "version", 0, NULL, 'V' },
- { "help", 0, NULL, 'H' },
- { 0 }
+ LOPTS_INITIALIZER,
+ {0}
};
static void print_version(void)
progname);
}
+static int
+print_optstring(const struct option *opt, const struct lopt_help *help)
+{
+ char optstring[100];
+ int w;
+
+ if (!ENABLE_NLS)
+ goto no_translate;
+
+ if (opt->has_arg) {
+ w = snprintf(optstring, sizeof optstring,
+ _(" -%c, --%s=%s"), opt->val, opt->name,
+ pgettext_expr(opt->name, help->arg));
+ } else {
+ w = snprintf(optstring, sizeof optstring,
+ _(" -%c, --%s"), opt->val, opt->name);
+ }
+
+ if (w < 0)
+ goto no_translate;
+
+ w = mbsnwidth(optstring, w, 0);
+ printf("%s", optstring);
+ goto out;
+
+no_translate:
+ if (opt->has_arg) {
+ w = printf(" -%c, --%s=%s", opt->val, opt->name, help->arg);
+ } else {
+ w = printf(" -%c, --%s", opt->val, opt->name);
+ }
+out:
+ if (w < 0 || w > 18) {
+ putchar('\n');
+ return 0;
+ }
+
+ return w;
+}
+
+/*
+ * Print a string, with each line indented by i spaces. The first line
+ * will be indented by w fewer spaces (to account for the cursor being in
+ * some other column).
+ */
+static void print_block(const char *s, int i, int w)
+{
+ for (; *s; w = 0) {
+ const char *nl = strchr(s, '\n');
+ int n = (nl ? nl-s : -1);
+
+ printf("%*s%.*s\n", i-w, "", n, s);
+ if (!nl)
+ break;
+
+ s = nl+1;
+ }
+}
+
static void print_help(void)
{
const struct option *opt;
+
print_usage(stdout);
puts(_("This is \"slotifier\": a tool to convert overlapping drill hits in Excellon\n"
puts(_("Options:"));
for (opt = lopts; opt->val; opt++) {
- const char *line, *text = "ARG";
- int w = 0;
+ struct lopt_help help;
+ int w;
- if (opt->has_arg) {
- switch (opt->val) {
- case 'o': text = _("FILE");
- }
-
- w += printf(_(" -%c, --%s=%s"),
- opt->val, opt->name, text);
- } else {
- w += printf(_(" -%c, --%s"), opt->val, opt->name);
- }
-
- if (w > 18) {
- putchar('\n');
- w = 0;
- }
-
- switch (opt->val) {
- case 'o':
- text = _("Output to FILE, instead of standard output.");
- break;
- case 'v':
- text = _("Increase verbosity (can be specified more than once).");
- break;
- case 'V':
- text = _("Print a version message and then exit.");
- break;
- case 'H':
- text = _("Print this message and then exit.");
- break;
- default:
- if (w)
- putchar('\n');
+ if (!lopt_get_help(opt, &help))
continue;
- }
- for (line = text; line[0];) {
- const char *nl = strchr(line, '\n');
+ w = print_optstring(opt, &help);
- if (!nl) {
- printf("%*s%s\n", 20-w, "", line);
- break;
- }
+ if (ENABLE_NLS)
+ help.desc = pgettext_expr(opt->name, help.desc);
- printf("%*s%.*s\n", 20-w, "", (int)(nl-line), line);
- line = nl+1;
- }
+ print_block(help.desc, 20, w);
}
putchar('\n');
puts(_("For more information, see the slotifier(1) man page."));
putchar('\n');
- printf(_("Report bugs to <%s>."), PACKAGE_BUGREPORT);
- putchar('\n');
+ /*
+ * TRANSLATORS: Please add *another line* indicating where users should
+ * report translation bugs.
+ */
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
static void init_i18n(void)