add_opt(&opt);
}
+bool opt_unregister(const char *names)
+{
+ int found = -1, i;
+
+ for (i = 0; i < opt_count; i++) {
+ if (opt_table[i].type == OPT_SUBTABLE)
+ continue;
+ if (strcmp(opt_table[i].names, names) == 0)
+ found = i;
+ }
+ if (found == -1)
+ return false;
+ opt_count--;
+ memmove(&opt_table[found], &opt_table[found+1], opt_count - found);
+ return true;
+}
+
void opt_register_table(const struct opt_table entry[], const char *desc)
{
unsigned int i, start = opt_count;
_opt_register((names), OPT_CB_ARG((cb), OPT_EARLY, (show),(arg)), \
(arg), (desc))
+/**
+ * opt_unregister - unregister an option.
+ * @names: the names it was registered with.
+ *
+ * This undoes opt_register[_early]_[no]arg. Returns true if the option was
+ * found, otherwise false.
+ */
+bool opt_unregister(const char *names);
+
/**
* opt_parse - parse arguments.
* @argc: pointer to argc
--- /dev/null
+#include <ccan/tap/tap.h>
+#include <stdlib.h>
+#include <ccan/opt/opt.c>
+#include <ccan/opt/usage.c>
+#include <ccan/opt/helpers.c>
+#include <ccan/opt/parse.c>
+#include "utils.h"
+
+int main(int argc, char *argv[])
+{
+ const char *myname = argv[0];
+
+ plan_tests(14);
+
+ /* Simple short arg.*/
+ opt_register_noarg("--aaa|-a", test_noarg, NULL, "AAAAAAll");
+ opt_register_noarg("-b", test_noarg, NULL, "AAAAAAll");
+
+ /* We can't unregister wrong ones, but can unregister correct one */
+ ok1(!opt_unregister("--aaa"));
+ ok1(!opt_unregister("-a"));
+ ok1(opt_unregister("--aaa|-a"));
+
+ /* Arg parsing works as if we'd never registered it */
+ ok1(parse_args(&argc, &argv, "-b", NULL));
+ ok1(argc == 1);
+ ok1(argv[0] == myname);
+ ok1(argv[1] == NULL);
+ ok1(test_cb_called == 1);
+
+ ok1(!parse_args(&argc, &argv, "--aaa", NULL));
+
+ /* We can still add another one OK. */
+ opt_register_noarg("-c", test_noarg, NULL, "AAAAAAll");
+ ok1(parse_args(&argc, &argv, "-c", NULL));
+ ok1(argc == 1);
+ ok1(argv[0] == myname);
+ ok1(argv[1] == NULL);
+ ok1(test_cb_called == 2);
+
+ /* parse_args allocates argv */
+ free(argv);
+ return exit_status();
+}