/*
- * Copyright © 2021 Nick Bowler
+ * Copyright © 2021-2022 Nick Bowler
*
* Helper functions for formatting --help program output.
*
*/
static int option_type(const struct option *opt)
{
- return ((opt->val <= CHAR_MAX) << 2) | (opt->has_arg & 3);
+ int ret = opt->has_arg & 3;
+
+ if (!opt->flag)
+ ret |= (opt->val <= CHAR_MAX) << 2;
+
+ return ret;
}
enum {
/*
- * 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"
#include <getopt.h>
-static char buf[1000];
-
int arg_to_int(const char *s)
{
char *end;
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] == '[') {
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 {
-dnl Copyright © 2015, 2021 Nick Bowler
+dnl Copyright © 2015, 2021-2022 Nick Bowler
dnl
dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2.
dnl This is free software: you are free to do what the fuck you want to.
[--quux -q '@<:@ARG@:>@'],
[--hello-this-is-a-very-long-option 20],
[--hello-this-is-a-very-long-option 50],
- [--not-long 12])], [0],
+ [--not-long 12],
+ [--flagged -f \&])], [0],
[[ --foo 7
-b, --bar 11
--baz=ARG 11
0
--hello-this-is-a-very-long-option 36
--not-long 12
+ --flagged 11
]])
AT_CLEANUP
[--quux -q '@<:@ARG@:>@'],
[--hello-this-is-a-very-long-option 20],
[--hello-this-is-a-very-long-option 50],
- [--not-long 12])], [0],
+ [--not-long 12],
+ [--flagged -f \&])], [0],
[[ -foo 6
-bar 6
-baz ARG 10
0
-hello-this-is-a-very-long-option 35
-not-long 11
+ -flagged 10
]])
AT_CLEANUP