]> git.draconx.ca Git - cdecl99.git/commitdiff
Add better --help text to the test programs.
authorNick Bowler <nbowler@draconx.ca>
Fri, 3 Jul 2020 00:12:25 +0000 (20:12 -0400)
committerNick Bowler <nbowler@draconx.ca>
Fri, 3 Jul 2020 03:19:45 +0000 (23:19 -0400)
At the very least these test programs can enumerate their own options
without requiring us to write any additional documentation.

test/crossparse.c
test/randomdecl.c
test/test.h

index f377c38142c2ae54644d0874cf4d80250ffe062f..05c3095a2d1953220e9860b934a1e2f5962b8c51 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ * Test that libcdecl can parse its own output.
+ * 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/>.
+ */
+
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -25,8 +43,18 @@ static void print_usage(FILE *f)
 
 static void print_help(void)
 {
+       const struct option *opt;
+
        print_usage(stdout);
-       puts("Detailed help coming soon.");
+       puts("Test that libcdecl can parse its own output.\n");
+
+       puts("Options:");
+       for (opt = lopts; opt->val; opt++) {
+               int w = print_option_start(opt, NULL);
+
+               if (w)
+                       putchar('\n');
+       }
 }
 
 enum {
index 8e404484648f56c6a0e8853e625ca5eca63eddef..a5b5d3cb39e99833c71a5603f5e70d72ca4ee172 100644 (file)
@@ -1,19 +1,19 @@
 /*
- *  Generate random C declarations for testing.
- *  Copyright © 2011 Nick Bowler
+ * Generate random C declarations for testing.
+ * 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 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.
+ * 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 <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -54,8 +54,18 @@ static void print_usage(FILE *f)
 
 static void print_help(void)
 {
+       const struct option *opt;
+
        print_usage(stdout);
-       puts("Detailed help coming soon.");
+       puts("Generate random C declarations for testing.\n");
+
+       puts("Options:");
+       for (opt = lopts; opt->val; opt++) {
+               int w = print_option_start(opt, NULL);
+
+               if (w)
+                       putchar('\n');
+       }
 }
 
 static struct cdecl *random_decl(struct gen_rng *rng)
index b8f7ee39273ddaca8ca72abdd7efb8c1856f47a2..dbf3f82e11170ff7e72fd85c3881b0fdf64a461d 100644 (file)
@@ -1,8 +1,80 @@
+/*
+ * 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;