ccanlint: fix and simplify depends-accurate (with strreg)
authorRusty Russell <rusty@rustcorp.com.au>
Sun, 9 Jan 2011 01:26:41 +0000 (11:56 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Sun, 9 Jan 2011 01:26:41 +0000 (11:56 +1030)
tools/ccanlint/tests/depends_accurate.c

index a6d3a73a85dd94b6b4289f4c14dd1100b260f80b..34db4f84d0dd75b9d402f7ead9bc798cdf88268b 100644 (file)
@@ -2,6 +2,7 @@
 #include <tools/tools.h>
 #include <ccan/talloc/talloc.h>
 #include <ccan/str/str.h>
+#include <ccan/str_talloc/str_talloc.h>
 #include <ccan/foreach/foreach.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <string.h>
 #include <ctype.h>
 
-static char *strip_spaces(const void *ctx, char *line)
-{
-       char *p = talloc_strdup(ctx, line);
-       unsigned int i, j;
-
-       for (i = 0, j = 0; p[i]; i++) {
-               if (!isspace(p[i]))
-                       p[j++] = p[i];
-       }
-       p[j] = '\0';
-       return p;
-}
-
 static bool has_dep(struct manifest *m, const char *depname)
 {
        struct manifest *i;
@@ -60,18 +48,12 @@ static void check_depends_accurate(struct manifest *m,
                        char **lines = get_ccan_file_lines(f);
 
                        for (i = 0; lines[i]; i++) {
-                               char *p;
-                               if (lines[i][strspn(lines[i], " \t")] != '#')
-                                       continue;
-                               p = strip_spaces(f, lines[i]);
-                               if (!strstarts(p, "#include<ccan/")
-                                   && !strstarts(p, "#include\"ccan/"))
-                                       continue;
-                               p += strlen("#include\"ccan/");
-                               if (!strchr(strchr(p, '/') + 1, '/'))
+                               char *mod;
+                               if (!strreg(f, lines[i],
+                                           "^[ \t]*#[ \t]*include[ \t]*[<\"]"
+                                           "ccan/+([^/]+)/", &mod))
                                        continue;
-                               *strchr(strchr(p, '/') + 1, '/') = '\0';
-                               if (has_dep(m, p))
+                               if (has_dep(m, mod))
                                        continue;
                                score->error = "Includes a ccan module"
                                        " not listed in _info";