]> git.draconx.ca Git - dxcommon.git/blobdiff - t/helpopt.c
help_print_optstring: Fix handling of 'flag' options.
[dxcommon.git] / t / helpopt.c
index 303e13ab8f8ed1f485d597905ff9a53c31480deb..51b08a7f1f8346eacaa59e613dee0e7b5f9006e7 100644 (file)
@@ -1,7 +1,33 @@
 /*
- * Read some text from standard input and format it with help_print_desc,
- * for testing.  Each pair of program arguments is converted to an int and
- * passed as the two integer arguments to help_print_desc.
+ * Copyright © 2021-2022 Nick Bowler
+ *
+ * Test helper application to verify help_print_optstring operation.
+ *
+ * Command-line arguments are collected to create the options to be formatted.
+ * There are six basic forms:
+ *
+ *   --long-option-only
+ *   --long-option-with-argument arg
+ *   --long-option-with-optional-argument [arg]
+ *   --short-option -s arg
+ *   --short-option-with-argument -s arg
+ *   --short-option-with-optional-argument -s [arg]
+ *
+ * Adding an argument of '&' to any form will set the "flag" member of
+ * the option structure to a non-null value.
+ *
+ * Based on these arguments, a suitable 'struct option' is constructed and
+ * passed to help_print_optstring.  Then a tab character is printed, followed
+ * by the return value of help_print_optsring (via printf %d).  Then further
+ * arguments are considered to output more options.
+ *
+ * Initially, the "l" value passed to help_print_optstring is 20.  This can be
+ * changed at any point by a numeric command-line argument, which will set a
+ * new value that applies to all subsequent calls until it is changed again.
+ *
+ * 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.
+ * There is NO WARRANTY, to the extent permitted by law.
  */
 #include "help.h"
 #include "tap.h"
@@ -14,8 +40,6 @@
 
 #include <getopt.h>
 
-static char buf[1000];
-
 int arg_to_int(const char *s)
 {
        char *end;
@@ -52,6 +76,7 @@ int main(int argc, char **argv)
                        opt.val = UCHAR_MAX+1;
                        opt.has_arg = 0;
                        opt.name = argv[i]+2;
+                       opt.flag = NULL;
                } else if (argv[i][0] == '-') {
                        opt.val = argv[i][1];
                } else if (argv[i][0] == '[') {
@@ -61,6 +86,9 @@ int main(int argc, char **argv)
                        if ((c = strchr(argname, ']')))
                                *c = 0;
                        opt.has_arg = 2;
+               } else if (argv[i][0] == '&') {
+                       static int dummy;
+                       opt.flag = &dummy;
                } else if (argv[i][0] >= '0' && argv[i][0] <= '9') {
                        w = arg_to_int(argv[i]);
                } else {