-/* Licensed under GPLv3+ - see LICENSE file for details */
+/* Licensed under GPLv2+ - see LICENSE file for details */
#ifndef CCAN_OPT_H
#define CCAN_OPT_H
#include <ccan/compiler/compiler.h>
* string (or see opt_set_alloc) and return false.
*
* Example:
- * static char *explode(const char *optarg, void *unused)
+ * static char *explode(const char *optarg, void *unused UNNEEDED)
* {
* errx(1, "BOOM! %s", optarg);
* }
bool opt_early_parse(int argc, char *argv[],
void (*errlog)(const char *fmt, ...));
+/**
+ * opt_early_parse_incomplete - parse early arguments, ignoring unknown ones.
+ * @argc: argc
+ * @argv: argv array.
+ * @errlog: the function to print errors
+ *
+ * If you have plugins, you might need to do early parsing (eg. to find the
+ * plugin directory) but you don't know what options the plugins will want.
+ *
+ * Thus, this function is just like opt_early_parse, but ignores unknown options.
+ *
+ * Example:
+ * if (!opt_early_parse_incomplete(argc, argv, opt_log_stderr)) {
+ * printf("You screwed up, aborting!\n");
+ * exit(1);
+ * }
+ *
+ * See Also:
+ * opt_early_parse()
+ */
+bool opt_early_parse_incomplete(int argc, char *argv[],
+ void (*errlog)(const char *fmt, ...));
+
+
/**
* opt_free_table - reset the opt library.
*
* and a table of all the options with their descriptions. If an option has
* description opt_hidden, it is not shown here.
*
+ * The table of options is formatted such that descriptions are
+ * wrapped on space boundaries. If a description has a "\n" that is
+ * left intact, and the following characters indented appropriately.
+ * If the description begins with one or more space/tab (or has a
+ * space or tab following a "\n") that line is output without wrapping.
+ *
* If "extra" is NULL, then the extra information is taken from any
* registered option which calls opt_usage_and_exit(). This avoids duplicating
* that string in the common case.
*
* The result should be passed to free().
+ *
+ * See Also:
+ * opt_usage_and_exit()
+ *
+ * Example:
+ * opt_register_arg("--explode|--boom", explode, NULL, NULL,
+ * "This line will be wrapped by opt_usage\n"
+ * " But this won't because it's indented.");
*/
char *opt_usage(const char *argv0, const char *extra);
+/**
+ * opt_usage_exit_fail - complain about bad usage to stderr, exit with status 1.
+ * @msg...: printf-style message to output.
+ *
+ * This prints argv[0] (if opt_parse has been called), a colon, then
+ * the message to stderr (just like errx()). Then it prints out the
+ * usage message, taken from any registered option which uses
+ * opt_usage_and_exit() as described in opt_usage(argv0, NULL) above.
+ * Then it exits with status 1.
+ *
+ * Example:
+ * if (argc != 5)
+ * opt_usage_exit_fail("Need 5 arguments, only got %u", argc);
+ */
+void opt_usage_exit_fail(const char *msg, ...) NORETURN;
+
/**
* opt_hidden - string for undocumented options.
*
char *opt_set_ulongval(const char *arg, unsigned long *ul);
void opt_show_ulongval(char buf[OPT_SHOW_LEN], const unsigned long *ul);
+/* Set an floating point value, various forms. */
+char *opt_set_floatval(const char *arg, float *f);
+void opt_show_floatval(char buf[OPT_SHOW_LEN], const float *f);
+char *opt_set_doubleval(const char *arg, double *d);
+void opt_show_doubleval(char buf[OPT_SHOW_LEN], const double *d);
+
/* the following setting functions accept k, M, G, T, P, or E suffixes, which
multiplies the numeric value by the corresponding power of 1000 or 1024
(for the _si and _bi versions, respectively).
-/* Increment. */
+/* Increment and decrement. */
char *opt_inc_intval(int *i);
+char *opt_dec_intval(int *i);
/* Display version string to stdout, exit(0). */
char *opt_version_and_exit(const char *version);