+/*
+ * Copyright © 2012, 2020 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
#ifndef CDECL_TEST_H_
#define CDECL_TEST_H_
#include <stddef.h>
#include <stdbool.h>
+#include <limits.h>
+#include <assert.h>
+#include <getopt.h>
+
+#ifndef _
+# define _(x) (x)
+#endif
+
+static inline int
+print_option_start(const struct option *opt, const char *argname)
+{
+ int w;
+
+ if (!argname)
+ argname = _("ARG");
+
+ if (opt->val >= CHAR_MIN && opt->val <= CHAR_MAX) {
+ switch (opt->has_arg) {
+ case 0:
+ w = printf(_(" -%c, --%s"), opt->val, opt->name);
+ break;
+ case 1:
+ w = printf(_(" -%c, --%s=%s"),
+ opt->val, opt->name, argname);
+ break;
+ case 2:
+ w = printf(_(" -%c, --%s[=%s]"),
+ opt->val, opt->name, argname);
+ break;
+ default:
+ assert(0);
+ }
+ } else {
+ switch (opt->has_arg) {
+ case 0:
+ w = printf(_(" --%s"), opt->name);
+ break;
+ case 1:
+ w = printf(_(" --%s=%s"), opt->name, argname);
+ break;
+ case 2:
+ w = printf(_(" --%s[=%s]"), opt->name, argname);
+ break;
+ default:
+ assert(0);
+ }
+ }
+
+ if (w > 18) {
+ putchar('\n');
+ w = 0;
+ }
+
+ return w;
+}
struct cdecl_declspec;
struct cdecl;