X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Fccanlint.c;h=81f9614739b2242410bb7524634101ddb1e191da;hp=b8dd467a18e78e76891dd2143962084cb1bde8a5;hb=076877c266706ba432987195422a1e8653bd0c3b;hpb=27b8937c5ed206e515c7b933f9593d7bc7f350e0 diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index b8dd467a..81f96147 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -32,6 +32,7 @@ #include #include #include +#include int verbose = 0; static LIST_HEAD(compulsory_tests); @@ -43,8 +44,8 @@ static struct btree *info_exclude; static unsigned int timeout; /* These are overridden at runtime if we can find config.h */ -char *compiler = NULL; -char *cflags = NULL; +const char *compiler = NULL; +const char *cflags = NULL; const char *config_header; @@ -160,9 +161,9 @@ static bool run_test(struct ccanlint *i, printf("%s%s", score->error, strends(score->error, "\n") ? "" : "\n"); } - if (!quiet && !score->pass && i->handle) - i->handle(m, score); } + if (!quiet && score->score < score->total && i->handle) + i->handle(m, score); *running_score += score->score; *running_total += score->total; @@ -284,24 +285,29 @@ static void init_tests(void) } btree_delete(keys); btree_delete(names); +} - if (!verbose) - return; +static void print_test_depends(void) +{ + struct list_head *list; foreach_ptr(list, &compulsory_tests, &normal_tests) { + struct ccanlint *c; printf("\%s Tests\n", list == &compulsory_tests ? "Compulsory" : "Normal"); - if (!list_empty(&c->dependencies)) { - const struct dependent *d; - printf("These depend on us:\n"); - list_for_each(&c->dependencies, d, node) - printf("\t%s\n", d->dependent->name); + list_for_each(list, c, list) { + if (!list_empty(&c->dependencies)) { + const struct dependent *d; + printf("These depend on %s:\n", c->key); + list_for_each(&c->dependencies, d, node) + printf("\t%s\n", d->dependent->key); + } } } } -static int show_tmpdir(char *dir) +static int show_tmpdir(const char *dir) { printf("You can find ccanlint working files in '%s'\n", dir); return 0; @@ -499,7 +505,7 @@ static char *demangle_string(char *string) if (string[i] == '\\') { char repl; unsigned len = 0; - char *p = strchr(mapfrom, string[i+1]); + const char *p = strchr(mapfrom, string[i+1]); if (p) { repl = mapto[p - mapfrom]; len = 1; @@ -508,7 +514,7 @@ static char *demangle_string(char *string) repl = (string[i+2]-'0')*16 + string[i+3]-'0'; len = 3; - } else if (isdigit(string[i+1])) { + } else if (cisdigit(string[i+1])) { repl = (string[i+2]-'0')*8*8 + (string[i+3]-'0')*8 + (string[i+4]-'0'); @@ -576,9 +582,14 @@ static void read_config_header(void) compiler = CCAN_CFLAGS; } +static char *opt_set_const_charp(const char *arg, const char **p) +{ + return opt_set_charp(arg, cast_const2(char **, p)); +} + int main(int argc, char *argv[]) { - bool summary = false; + bool summary = false, pass = true; unsigned int score = 0, total_score = 0; struct manifest *m; struct ccanlint *i; @@ -613,9 +624,9 @@ int main(int argc, char *argv[]) opt_register_arg("--target ", opt_set_charp, NULL, &target, "only run one test (and its prerequisites)"); - opt_register_arg("--compiler ", opt_set_charp, + opt_register_arg("--compiler ", opt_set_const_charp, NULL, &compiler, "set the compiler"); - opt_register_arg("--cflags ", opt_set_charp, + opt_register_arg("--cflags ", opt_set_const_charp, NULL, &cflags, "set the compiler flags"); opt_register_noarg("-?|-h|--help", opt_usage_and_exit, "\nA program for checking and guiding development" @@ -634,8 +645,10 @@ int main(int argc, char *argv[]) dir[strlen(dir)-1] = '\0'; if (dir != base_dir) prefix = talloc_append_string(talloc_basename(NULL, dir), ": "); - if (verbose >= 3) + if (verbose >= 3) { compile_verbose = true; + print_test_depends(); + } if (verbose >= 4) tools_verbose = true; @@ -665,11 +678,12 @@ int main(int argc, char *argv[]) } /* --target overrides known FAIL from _info */ - add_info_options(m->info_file, !target); + if (m->info_file) + add_info_options(m->info_file, !target); while ((i = get_next_test(&normal_tests)) != NULL) - run_test(i, summary, &score, &total_score, m); + pass &= run_test(i, summary, &score, &total_score, m); printf("%sTotal score: %u/%u\n", prefix, score, total_score); - return 0; + return pass ? 0 : 1; }