ccanlint: neaten info_summary_single_line with new doc_section info.
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 17 Jan 2011 03:52:29 +0000 (14:22 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 17 Jan 2011 03:52:29 +0000 (14:22 +1030)
tools/ccanlint/tests/info_summary_single_line.c

index 12f95e6e138325ea7fc40c0a17134bedca73987a..19e9ada5faeeee184e29dc72ef15d9dbf67437b6 100644 (file)
@@ -4,50 +4,34 @@
 #include <ccan/talloc/talloc.h>
 #include <ccan/str/str.h>
 
-/* Summary line is form '<identifier> - ' (spaces for 'struct foo -') */
-/* slightly modified from doc_extract-core.c */
-static unsigned int is_summary_line(const char *line)
-{
-       unsigned int id_len;
-
-       id_len = strspn(line, IDENT_CHARS" *");
-       if (id_len == 0)
-               return 0;
-       if (strspn(line, " ") == id_len)
-               return 0;
-       if (!strstarts(line + id_len-1, " - "))
-               return 0;
-       return id_len - 1;
-}
-
 static void check_info_summary_single_line(struct manifest *m,
                                           bool keep,
                                           unsigned int *timeleft,
                                           struct score *score)
 {
-       int i = 0;
-       get_ccan_line_info(m->info_file);
-       score->total = 1;
-       for (i = 0; i < m->info_file->num_lines; ++i) {
-               if (is_summary_line(m->info_file->lines[i])) {
-                       if (strspn(m->info_file->lines[i+1], " *") == strlen(m->info_file->lines[i+1])) {
-                               /* valid summary line */
-                               score->error = NULL;
-                               score->pass = true;
-                               score->score = 1;
-                       } else {
-                               /* invalid summary line - line following summary line should be empty */
-                               score->pass = false;
-                               score->score = 0;
-                               score->error = "invalid summary line - not on a single line:";
-                               score_file_error(score, m->info_file, i+1, "summary is not on a single line");
-                       }
-                       break;
+       struct list_head *infodocs = get_ccan_file_docs(m->info_file);
+       struct doc_section *d;
+
+       score->pass = true;
+       list_for_each(infodocs, d, list) {
+               const char *after;
+
+               if (!streq(d->type, "summary"))
+                       continue;
+
+               /* line following summary line should be empty */
+               after = m->info_file->lines[d->srcline+1];
+               if (after && strspn(after, " *") != strlen(after)) {
+                       score->pass = false;
+                       score->score = 0;
+                       score_file_error(score, m->info_file, d->srcline+1,
+                                        m->info_file->lines[d->srcline]);
+                       score_file_error(score, m->info_file, d->srcline+2,
+                                        m->info_file->lines[d->srcline+1]);
                }
        }
 }
 
-
 struct ccanlint info_summary_single_line = {
        .key = "info_summary_single_line",
        .name = "Module has a single line summary in _info",