From: Rusty Russell Date: Fri, 8 Oct 2010 00:56:17 +0000 (+1030) Subject: ccanlint: use opt package. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=8d70667887ba081d76075e8959adafb22983b03a ccanlint: use opt package. Now we get long options! --- diff --git a/tools/ccanlint/Makefile b/tools/ccanlint/Makefile index 5398d380..bbd37054 100644 --- a/tools/ccanlint/Makefile +++ b/tools/ccanlint/Makefile @@ -11,7 +11,8 @@ CORE_OBJS := tools/ccanlint/ccanlint.o \ ccan/str_talloc/str_talloc.o ccan/grab_file/grab_file.o \ ccan/btree/btree.o \ ccan/talloc/talloc.o ccan/noerr/noerr.o \ - ccan/read_write_all/read_write_all.o + ccan/read_write_all/read_write_all.o \ + ccan/opt/opt.o ccan/opt/usage.o ccan/opt/helpers.o OBJS := $(CORE_OBJS) $(TEST_OBJS) diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index d19ede62..51962de8 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -19,7 +19,6 @@ #include "ccanlint.h" #include "../tools.h" #include -#include #include #include #include @@ -30,8 +29,9 @@ #include #include #include +#include -unsigned int verbose = 0; +int verbose = 0; static LIST_HEAD(compulsory_tests); static LIST_HEAD(normal_tests); static LIST_HEAD(finished_tests); @@ -40,21 +40,6 @@ static struct btree *cmdline_exclude; static struct btree *info_exclude; static unsigned int timeout; -static void usage(const char *name) -{ - fprintf(stderr, "Usage: %s [-s] [-n] [-v] [-t ] [-d ] [-x ]* [-k ]*\n" - " -v: verbose mode (can specify more than once)\n" - " -s: simply give one line summary\n" - " -d: use this directory instead of the current one\n" - " -n: do not compile anything\n" - " -l: list tests ccanlint performs\n" - " -k: keep results of this test (can be used multiple times)\n" - " -x: exclude tests (can be used multiple times)\n" - " -t: ignore (terminate) tests that are slower than this\n", - name); - exit(1); -} - #if 0 static void indent_print(const char *string) { @@ -306,12 +291,19 @@ static struct ccanlint *find_test(const char *key) return NULL; } -static void keep_test(const char *testname) +static char *keep_test(const char *testname, void *unused) { struct ccanlint *i = find_test(testname); if (!i) errx(1, "No test %s to --keep", testname); i->keep_results = true; + return NULL; +} + +static char *skip_test(const char *testname, void *unused) +{ + btree_insert(cmdline_exclude, optarg); + return NULL; } static void print_tests(struct list_head *tests, const char *type) @@ -329,7 +321,7 @@ static void print_tests(struct list_head *tests, const char *type) } } -static void list_tests(void) +static char *list_tests(void *arg) { print_tests(&compulsory_tests, "Compulsory"); print_tests(&normal_tests, "Normal"); @@ -359,63 +351,46 @@ static void add_info_fails(struct ccan_file *info) int main(int argc, char *argv[]) { - int c; bool summary = false; unsigned int score = 0, total_score = 0; struct manifest *m; struct ccanlint *i; - const char *prefix = "", *dir = talloc_getcwd(NULL); + const char *prefix = ""; + char *dir = talloc_getcwd(NULL), *base_dir = dir; init_tests(); cmdline_exclude = btree_new(btree_strcmp); info_exclude = btree_new(btree_strcmp); - /* I'd love to use long options, but that's not standard. */ - /* FIXME: popt ccan package? */ - while ((c = getopt(argc, argv, "sd:vnlx:t:k:")) != -1) { - switch (c) { - case 'd': - if (optarg[0] != '/') - dir = talloc_asprintf_append(NULL, "%s/%s", - dir, optarg); - else - dir = optarg; - prefix = talloc_append_string(talloc_basename(NULL, - optarg), - ": "); - break; - case 'l': - list_tests(); - case 's': - summary = true; - break; - case 'v': - verbose++; - break; - case 'n': - safe_mode = true; - break; - case 'k': - keep_test(optarg); - break; - case 'x': - btree_insert(cmdline_exclude, optarg); - break; - case 't': - timeout = atoi(optarg); - if (!timeout) - errx(1, "Invalid timeout %s: 1 ms minumum", - optarg); - break; - default: - usage(argv[0]); - } - } - - if (optind < argc) - usage(argv[0]); - + opt_register_arg("--dir/-d", opt_set_charp, opt_show_charp, &dir, + "use this directory"); + opt_register_noarg("-n/--safe-mode", opt_set_bool, &safe_mode, + "do not compile anything"); + opt_register_noarg("-l/--list-tests", list_tests, NULL, + "list tests ccanlint performs (and exit)"); + opt_register_arg("-k/--keep ", keep_test, NULL, NULL, + "keep results of (can be used multiple times)"); + opt_register_noarg("--summary/-s", opt_set_bool, &summary, + "simply give one line summary"); + opt_register_noarg("--verbose/-v", opt_inc_intval, &verbose, + "verbose mode (can specify more than once)"); + opt_register_arg("-x/--exclude ", skip_test, NULL, NULL, + "exclude (can be used multiple times)"); + opt_register_arg("-t/--timeout ", opt_set_uintval, + NULL, &timeout, + "ignore (terminate) tests that are slower than this"); + opt_register_noarg("-?/-h/--help", opt_usage_and_exit, + "\nA program for checking and guiding development" + " of CCAN modules.", + "This usage message"); + + opt_parse(&argc, argv, opt_log_stderr_exit); + + if (dir[0] != '/') + dir = talloc_asprintf_append(NULL, "%s/%s", base_dir, dir); + if (dir != base_dir) + prefix = talloc_append_string(talloc_basename(NULL, dir), ": "); if (verbose >= 2) compile_verbose = true; if (verbose >= 3) diff --git a/tools/ccanlint/ccanlint.h b/tools/ccanlint/ccanlint.h index 7d9bd7c8..0bfb6a62 100644 --- a/tools/ccanlint/ccanlint.h +++ b/tools/ccanlint/ccanlint.h @@ -14,7 +14,7 @@ /* 1 == Describe results for partial failures. 2 == Describe gory details. 3 == Describe every action. */ -extern unsigned int verbose; +extern int verbose; struct manifest { char *dir;