summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2008-11-12 11:35:04 +1030
committerRusty Russell <rusty@rustcorp.com.au>2008-11-12 11:35:04 +1030
commitcac3b2dd745bd86b26b176f06a7545bfa67112eb (patch)
tree74ab0d85042888e5d98c4977ba5c5ef34c03c64d
parenta8b248ea9de55316cac4423a99a727ca7b54e0fc (diff)
Add --function= arg to doc_extract so we can use it on normal ccan C
files.
-rw-r--r--tools/doc_extract.c77
-rw-r--r--tools/namespacize.c4
-rw-r--r--tools/tools.h4
3 files changed, 69 insertions, 16 deletions
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 <ccan/str/str.h>
#include <ccan/str_talloc/str_talloc.h>
#include <ccan/grab_file/grab_file.h>
+#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 '<identifier> - ' */
+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 <file>...\n"
- "Where TYPE is author|licence|maintainer|summary|description|example|all");
+ errx(1, "Usage: doc_extract [--function=<funcname>] TYPE <file>...\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 <stdbool.h>
+#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. */