X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;ds=sidebyside;f=ccan%2Fopt%2Fopt.c;h=d4601dfbb230a3076edfa64d8b5232996f4d59d2;hb=c36444e062622d97e4368670f5c50f0c482a3a95;hp=85de935a7d3b77fc2591b1435b1b38e79ff741cf;hpb=641b511049e5c03d45ada0c3fd829691b173e5d1;p=ccan diff --git a/ccan/opt/opt.c b/ccan/opt/opt.c index 85de935a..d4601dfb 100644 --- a/ccan/opt/opt.c +++ b/ccan/opt/opt.c @@ -1,4 +1,4 @@ -/* Licensed under GPLv3+ - see LICENSE file for details */ +/* Licensed under GPLv2+ - see LICENSE file for details */ #include #include #include @@ -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; @@ -207,14 +224,15 @@ bool opt_parse(int *argc, char *argv[], void (*errlog)(const char *fmt, ...)) /* This helps opt_usage. */ opt_argv0 = argv[0]; - while ((ret = parse_one(argc, argv, 0, &offset, errlog)) == 1); + while ((ret = parse_one(argc, argv, 0, &offset, errlog, false)) == 1); /* parse_one returns 0 on finish, -1 on error */ return (ret == 0); } -bool opt_early_parse(int argc, char *argv[], - void (*errlog)(const char *fmt, ...)) +static bool early_parse(int argc, char *argv[], + void (*errlog)(const char *fmt, ...), + bool ignore_unknown) { int ret; unsigned off = 0; @@ -226,7 +244,7 @@ bool opt_early_parse(int argc, char *argv[], /* This helps opt_usage. */ opt_argv0 = argv[0]; - while ((ret = parse_one(&argc, tmpargv, OPT_EARLY, &off, errlog)) == 1); + while ((ret = parse_one(&argc, tmpargv, OPT_EARLY, &off, errlog, ignore_unknown)) == 1); opt_alloc.free(tmpargv); @@ -234,6 +252,18 @@ bool opt_early_parse(int argc, char *argv[], return (ret == 0); } +bool opt_early_parse(int argc, char *argv[], + void (*errlog)(const char *fmt, ...)) +{ + return early_parse(argc, argv, errlog, false); +} + +bool opt_early_parse_incomplete(int argc, char *argv[], + void (*errlog)(const char *fmt, ...)) +{ + return early_parse(argc, argv, errlog, true); +} + void opt_free_table(void) { opt_alloc.free(opt_table);