X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Ffile_analysis.c;h=a4282a96c75b06a68d7a895346c3650747a7a8aa;hp=e8c8ebc6dbb057f24849a6edd541c5c6cfda028d;hb=939fab341caaa06d032b29f06362335de0db82cc;hpb=e169f82bbe459c6cfb80d5180f3ceb61a66a52ed diff --git a/tools/ccanlint/file_analysis.c b/tools/ccanlint/file_analysis.c index e8c8ebc6..a4282a96 100644 --- a/tools/ccanlint/file_analysis.c +++ b/tools/ccanlint/file_analysis.c @@ -1,3 +1,4 @@ +#include "config.h" #include "ccanlint.h" #include #include @@ -9,6 +10,7 @@ #include #include #include +#include #include "../tools.h" #include #include @@ -73,6 +75,7 @@ struct list_head *get_ccan_file_docs(struct ccan_file *f) struct ccan_file *new_ccan_file(const void *ctx, const char *dir, char *name) { struct ccan_file *f; + unsigned int i; assert(dir[0] == '/'); @@ -80,11 +83,12 @@ struct ccan_file *new_ccan_file(const void *ctx, const char *dir, char *name) f->lines = NULL; f->line_info = NULL; f->doc_sections = NULL; - f->compiled = NULL; + for (i = 0; i < ARRAY_SIZE(f->compiled); i++) + f->compiled[i] = NULL; f->name = talloc_steal(f, name); f->fullname = talloc_asprintf(f, "%s/%s", dir, f->name); f->contents = NULL; - f->cov_compiled = NULL; + f->simplified = NULL; return f; } @@ -135,10 +139,7 @@ static void add_files(struct manifest *m, const char *dir) is_c_src = strends(f->name, ".c"); if (!is_c_src && !strends(f->name, ".h")) { dest = &m->other_files; - continue; - } - - if (!strchr(f->name, '/')) { + } else if (!strchr(f->name, '/')) { if (is_c_src) dest = &m->c_files; else @@ -230,7 +231,7 @@ struct manifest *get_manifest(const void *ctx, const char *dir) m = talloc_linked(ctx, talloc(NULL, struct manifest)); m->info_file = NULL; - m->compiled = NULL; + m->compiled[COMPILE_NORMAL] = m->compiled[COMPILE_NOFEAT] = NULL; m->dir = talloc_steal(m, canon_dir); list_head_init(&m->c_files); list_head_init(&m->h_files); @@ -256,16 +257,17 @@ struct manifest *get_manifest(const void *ctx, const char *dir) /* We expect the ccan dir to be two levels above module dir. */ if (!ccan_dir) { - char *p; - ccan_dir = talloc_strdup(NULL, m->dir); - p = strrchr(ccan_dir, '/'); + char *p, *dir; + dir = talloc_strdup(NULL, m->dir); + p = strrchr(dir, '/'); if (!p) errx(1, "I expect the ccan root directory in ../.."); *p = '\0'; - p = strrchr(ccan_dir, '/'); + p = strrchr(dir, '/'); if (!p) errx(1, "I expect the ccan root directory in ../.."); *p = '\0'; + ccan_dir = dir; } add_files(m, ""); @@ -349,7 +351,7 @@ static char *remove_comments(const char *line, bool in_comment, static bool is_empty(const char *line) { - return strspn(line, " \t") == strlen(line); + return strspn(line, " \r\t") == strlen(line); } static bool continues(const char *line) @@ -364,7 +366,7 @@ bool get_token(const char **line, const char *token) unsigned int toklen; *line += strspn(*line, " \t"); - if (isalnum(token[0]) || token[0] == '_') + if (cisalnum(token[0]) || token[0] == '_') toklen = strspn(*line, IDENT_CHARS); else { /* FIXME: real tokenizer handles ++ and other multi-chars. */ @@ -406,6 +408,17 @@ static bool parse_hash_if(struct pp_conditions *cond, const char **line) return false; if (!defined) cond->type = PP_COND_IF; + + /* FIXME: We just chain them, ignoring operators. */ + if (get_token(line, "||") || get_token(line, "&&")) { + struct pp_conditions *sub = talloc(cond, struct pp_conditions); + + sub->parent = cond->parent; + sub->type = PP_COND_IFDEF; + if (parse_hash_if(sub, line)) + cond->parent = sub; + } + return true; }