X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=tools%2Fccanlint%2Ffile_analysis.c;h=e8c8ebc6dbb057f24849a6edd541c5c6cfda028d;hb=dfc94d4a4b80729b092089536caa33c0620a5ea9;hp=b941f94e1c31e84c765b522f36da38338b7bca0b;hpb=7bb7cd58c2d9df126dd6072e5f3bec1eb4dc916b;p=ccan diff --git a/tools/ccanlint/file_analysis.c b/tools/ccanlint/file_analysis.c index b941f94e..e8c8ebc6 100644 --- a/tools/ccanlint/file_analysis.c +++ b/tools/ccanlint/file_analysis.c @@ -54,9 +54,10 @@ const char *get_ccan_file_contents(struct ccan_file *f) char **get_ccan_file_lines(struct ccan_file *f) { if (!f->lines) - f->lines = strsplit(f, get_ccan_file_contents(f), - "\n", &f->num_lines); + f->lines = strsplit(f, get_ccan_file_contents(f), "\n"); + /* FIXME: is f->num_lines necessary? */ + f->num_lines = talloc_array_length(f->lines) - 1; return f->lines; } @@ -64,7 +65,7 @@ struct list_head *get_ccan_file_docs(struct ccan_file *f) { if (!f->doc_sections) { get_ccan_file_lines(f); - f->doc_sections = extract_doc_sections(f->lines, f->num_lines); + f->doc_sections = extract_doc_sections(f->lines); } return f->doc_sections; } @@ -91,6 +92,7 @@ static void add_files(struct manifest *m, const char *dir) { DIR *d; struct dirent *ent; + char **subs = NULL; if (dir[0]) d = opendir(dir); @@ -115,8 +117,9 @@ static void add_files(struct manifest *m, const char *dir) err(1, "lstat %s", f->name); if (S_ISDIR(st.st_mode)) { - f->name = talloc_append_string(f->name, "/"); - add_files(m, f->name); + size_t len = talloc_array_length(subs); + subs = talloc_realloc(m, subs, char *, len+1); + subs[len] = talloc_append_string(f->name, "/"); continue; } if (!S_ISREG(st.st_mode)) { @@ -160,6 +163,20 @@ static void add_files(struct manifest *m, const char *dir) list_add(dest, &f->list); } closedir(d); + + /* Before we recurse, sanity check this is a ccan module. */ + if (!dir[0]) { + size_t i; + + if (!m->info_file + && list_empty(&m->c_files) + && list_empty(&m->h_files)) + errx(1, "No _info, C or H files found here!"); + + for (i = 0; i < talloc_array_length(subs); i++) + add_files(m, subs[i]); + } + talloc_free(subs); } static int cmp_names(struct ccan_file *const *a, struct ccan_file *const *b, @@ -242,8 +259,12 @@ struct manifest *get_manifest(const void *ctx, const char *dir) char *p; ccan_dir = talloc_strdup(NULL, m->dir); p = strrchr(ccan_dir, '/'); + if (!p) + errx(1, "I expect the ccan root directory in ../.."); *p = '\0'; p = strrchr(ccan_dir, '/'); + if (!p) + errx(1, "I expect the ccan root directory in ../.."); *p = '\0'; }