From: Rusty Russell Date: Wed, 12 Nov 2008 01:05:04 +0000 (+1030) Subject: Add --function= arg to doc_extract so we can use it on normal ccan C X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=cac3b2dd745bd86b26b176f06a7545bfa67112eb Add --function= arg to doc_extract so we can use it on normal ccan C files. --- diff --git a/tools/doc_extract.c b/tools/doc_extract.c index 987ca1ad..b1e85d7b 100644 --- a/tools/doc_extract.c +++ b/tools/doc_extract.c @@ -12,13 +12,14 @@ #include #include #include +#include "tools.h" static char **grab_doc(const char *fname) { char *file; char **lines, **ret; unsigned int i, num; - bool printing = false, printed = false; + bool printing = false; file = grab_file(NULL, fname, NULL); if (!file) @@ -30,8 +31,8 @@ static char **grab_doc(const char *fname) for (i = 0; lines[i]; i++) { if (streq(lines[i], "/**")) { printing = true; - if (printed++) - talloc_append_string(ret[num], "\n"); + if (num != 0) + talloc_append_string(ret[num-1], "\n"); } else if (streq(lines[i], " */")) printing = false; else if (printing) { @@ -71,10 +72,23 @@ static bool is_section(const char *line, bool maybe_one_liner) return line[len] == ':' && is_blank(line+len+1); } +/* Summary line is form ' - ' */ +static bool is_summary_line(const char *line) +{ + unsigned int id_len; + + id_len = strspn(line, IDENT_CHARS); + if (id_len == 0) + return false; + if (!strstarts(line + id_len, " - ")) + return false; + + return true; +} static bool end_section(const char *line) { - return !line || is_section(line, true); + return !line || is_section(line, true) || is_summary_line(line); } static unsigned int find_section(char **lines, const char *name, @@ -93,14 +107,41 @@ static unsigned int find_section(char **lines, const char *name, return i; } +/* function is NULL if we don't care. */ +static unsigned int find_summary(char **lines, const char *function) +{ + unsigned int i; + + for (i = 0; lines[i]; i++) { + if (!is_summary_line(lines[i])) + continue; + if (function) { + if (!strstarts(lines[i], function)) + continue; + if (!strstarts(lines[i] + strlen(function), " - ")) + continue; + } + break; + } + return i; +} + + int main(int argc, char *argv[]) { unsigned int i; const char *type; + const char *function = NULL; if (argc < 3) - errx(1, "Usage: doc_extract TYPE ...\n" - "Where TYPE is author|licence|maintainer|summary|description|example|all"); + errx(1, "Usage: doc_extract [--function=] TYPE ...\n" + "Where TYPE is functions|author|licence|maintainer|summary|description|example|all"); + + if (strstarts(argv[1], "--function=")) { + function = argv[1] + strlen("--function="); + argv++; + argc--; + } type = argv[1]; for (i = 2; i < argc; i++) { @@ -108,8 +149,18 @@ int main(int argc, char *argv[]) char **lines = grab_doc(argv[i]); if (!lines[0]) - errx(1, "No documentation in file"); + errx(1, "No documentation in file %s", argv[i]); + + if (function) { + /* Allow us to trawl multiple files for a function */ + line = find_summary(lines, function); + if (!lines[line]) + continue; + /* Trim to just this function then. */ + lines += line; + lines[find_summary(lines+1, NULL)] = NULL; + } /* Simple one-line fields. */ if (streq(type, "author") || streq(type, "maintainer") @@ -164,16 +215,18 @@ int main(int argc, char *argv[]) line++; } } + } else if (streq(type, "functions")) { + while (lines[line = find_summary(lines, NULL)]) { + const char *dash = strstr(lines[line], " - "); + printf("%.*s\n", + dash - lines[line], lines[line]); + lines += line+1; + } } else if (streq(type, "all")) { for (line = 0; lines[line]; line++) puts(lines[line]); } else errx(1, "Unknown type '%s'", type); - - talloc_free(lines); } return 0; } - - - diff --git a/tools/namespacize.c b/tools/namespacize.c index cbee678c..f5dced5d 100644 --- a/tools/namespacize.c +++ b/tools/namespacize.c @@ -16,10 +16,6 @@ #include "ccan/talloc/talloc.h" #include "tools.h" -#define IDENT_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ - "abcdefghijklmnopqrstuvwxyz" \ - "01234567889_" - static bool verbose = false; static int indent = 0; #define verbose(args...) \ diff --git a/tools/tools.h b/tools/tools.h index a7612c7a..44951255 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -2,6 +2,10 @@ #define CCAN_TOOLS_H #include +#define IDENT_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ + "abcdefghijklmnopqrstuvwxyz" \ + "01234567889_" + #define CFLAGS "-O3 -Wall -Wundef -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Werror -Iccan/ -I." /* This actually compiles and runs the _info.c file to get dependencies. */