[cairo] [PATCH 01/12] doc: Add script to enforce stricter validation of documentation comments
Andrea Canciani
ranma42 at gmail.com
Tue Mar 27 04:25:48 PDT 2012
---
src/Makefile.am | 4 +-
src/check-doc-syntax.awk | 105 ++++++++++++++++++++++++++++++++++++++++++++++
src/check-doc-syntax.sh | 4 ++
3 files changed, 111 insertions(+), 2 deletions(-)
create mode 100755 src/check-doc-syntax.awk
diff --git a/src/Makefile.am b/src/Makefile.am
index ef01abb..acf0a82 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -89,7 +89,7 @@ TESTS_ENVIRONMENT = \
$(NULL)
TESTS_SH = \
check-def.sh \
- check-doc-syntax.sh\
+ check-doc-syntax.sh \
check-headers.sh \
check-plt.sh \
check-preprocessor-syntax.sh \
@@ -100,7 +100,7 @@ else
TESTS += check-link$(EXEEXT)
endif
-EXTRA_DIST += $(TESTS_SH) check-has-hidden-symbols.c
+EXTRA_DIST += $(TESTS_SH) check-has-hidden-symbols.c check-doc-syntax.awk
check_PROGRAMS += check-link
check_link_LDADD = libcairo.la
diff --git a/src/check-doc-syntax.awk b/src/check-doc-syntax.awk
new file mode 100755
index 0000000..d4325ce
--- /dev/null
+++ b/src/check-doc-syntax.awk
@@ -0,0 +1,105 @@
+#!/usr/bin/awk -f
+
+BEGIN {
+ name_found = 1
+ SECTION_DOC = 0
+ PUBLIC_DOC = 1
+ PRIVATE_DOC = 2
+}
+
+function log_msg(severity, msg)
+{
+ printf "%s (%d): %s: %s %s\n", FILENAME, FNR, severity, doc_name, msg
+}
+
+function log_error(msg)
+{
+ log_msg("ERROR", msg)
+}
+
+function log_warning(msg)
+{
+ log_msg("WARNING", msg)
+}
+
+/^\/\*\*$/ {
+ in_doc = 1
+ doc_line = 0
+}
+
+/^(\/\*\*$| \*[ \t]| \*$| \*\*\/$)/ {
+ valid_doc = 1
+}
+
+in_doc {
+ if (!valid_doc)
+ log_error("bad line: '" $0 "'")
+ valid_doc = 0
+
+ doc_line++
+ if (doc_line == 2) {
+ # new doc name. Did we find the previous one?
+ # (macros are not expected to be found in the same place as
+ # their documentation)
+ if (!name_found && doc_name !~ /CAIRO_/)
+ log_warning("not found")
+ doc_name = $2
+ if (doc_name ~ /^SECTION:.*$/) {
+ doc_type = SECTION_DOC
+ name_found = 1
+ } else if (tolower(doc_name) ~ /^cairo_[a-z0-9_]*:$/) {
+ doc_type = PUBLIC_DOC
+ name_found = 0
+ real_name = substr(doc_name, 1, length(doc_name) - 1)
+ } else if (tolower(doc_name) ~ /^_[a-z0-9_]*:$/) {
+ doc_type = PRIVATE_DOC
+ name_found = 0
+ real_name = substr(doc_name, 1, length(doc_name) - 1)
+ } else {
+ log_error("invalid doc id (should be 'cairo_...:')")
+ name_found = 1
+ }
+ }
+}
+
+!in_doc {
+ regex = "(^|[ \\t\\*])" real_name "([ ;()]|$)"
+ if ($0 ~ regex)
+ name_found = 1
+}
+
+/^ \* Since: ([0-9]*.[0-9]*|TBD)$/ {
+ doc_has_since = doc_line
+}
+
+/^ \*\*\// {
+ if (doc_type == PUBLIC_DOC) {
+ if (!doc_has_since) {
+ # private types can start with cairo_
+ if (doc_name ~ /^cairo_.*_t:$/)
+ log_warning("missing 'Since' field (is it a private type?)")
+ else
+ log_error("missing 'Since' field")
+ } else if (doc_has_since != doc_line - 1)
+ log_warning("misplaced 'Since' field (should be right before the end of the comment)")
+ } else {
+ if (doc_has_since)
+ log_warning("'Since' field in non-public element")
+ }
+
+ in_doc = 0
+ doc_has_since = 0
+ doc_type = 0
+}
+
+/\*\// {
+ if (in_doc) {
+ in_doc = 0
+ log_error("documentation comment not closed with **/")
+ }
+}
+
+END {
+ if (!name_found)
+ log_warning("not found")
+}
\ No newline at end of file
diff --git a/src/check-doc-syntax.sh b/src/check-doc-syntax.sh
index 8390e5e..570b9d9 100755
--- a/src/check-doc-syntax.sh
+++ b/src/check-doc-syntax.sh
@@ -70,4 +70,8 @@ if echo $FILES | xargs grep "$note_regexp" /dev/null; then
echo Be civil and replace it by 'Note' please.
fi >&2
+if echo $FILES | xargs ./check-doc-syntax.awk ; then
+ stat=1
+fi >&2
+
exit $stat
--
1.7.5.4
More information about the cairo
mailing list