Commit c36444e0 authored by Rusty Russell's avatar Rusty Russell

opt: add opt_unregister.

Sometimes we all make mistakes.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent a1f9c169
......@@ -176,6 +176,23 @@ void _opt_register(const char *names, enum opt_type type,
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;
......
......@@ -228,6 +228,15 @@ void opt_register_table(const struct opt_table *table, const char *desc);
_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
......
#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();
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment