VPP-62 Add a doxy filter to enable vpe.api doc

This makes Doxygen think the API definitions are structs which is close
enough to be able to document the API methods.

It also has logic to create an indexed API page but that's disabled for
now because it duplicates the "brief" text twice in the struct doc.

Fixes a minor line numbering issue in filter_c.py.

Change-Id: If380160b73e7c10d999b35a76f55d0e27cbc91cc
Signed-off-by: Chris Luke <chrisy@flirble.org>
diff --git a/doxygen/doxygen.cfg b/doxygen/doxygen.cfg
index 6d6bb6c..ec4312c 100644
--- a/doxygen/doxygen.cfg
+++ b/doxygen/doxygen.cfg
@@ -281,7 +281,7 @@
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
 # the files are not read by doxygen.
 
-EXTENSION_MAPPING      = def=C
+EXTENSION_MAPPING      = def=C api=C
 
 # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
 # according to the Markdown format, which allows for more readable
@@ -796,7 +796,7 @@
 # *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
 # *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
 
-FILE_PATTERNS          = *.md *.c *.h *.def *.inc *.S *.dox
+FILE_PATTERNS          = *.md *.c *.h *.def *.inc *.S *.dox *.api
 
 # The RECURSIVE tag can be used to specify whether or not subdirectories should
 # be searched for input files as well.
@@ -898,7 +898,9 @@
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
 # properly processed by doxygen.
 
-FILTER_PATTERNS        = *.c=$(ROOT)/doxygen/filter_c.py
+FILTER_PATTERNS        = \
+	*.c=$(ROOT)/doxygen/filter_c.py \
+	*.api=$(ROOT)/doxygen/filter_api.py
 
 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
 # INPUT_FILTER) will also be used to filter the input files that are used for
diff --git a/doxygen/filter_api.py b/doxygen/filter_api.py
new file mode 100755
index 0000000..3e2aaae
--- /dev/null
+++ b/doxygen/filter_api.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+# Copyright (c) 2016 Comcast Cable Communications Management, LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Filter for vpe.api to make it Doxygenish.
+
+import sys, re
+
+if len(sys.argv) < 2:
+    sys.stderr.write("Usage: %s <filename>\n" % (sys.argv[0]))
+    sys.exit(1)
+
+patterns = [
+    # Search for "define" blocks and treat them as structs
+    ( re.compile(r"^.*(manual_.[^\s]+\s+)?define\s+(?P<name>[^\s]+)"), r"typedef struct vl_api_\g<name>_t"),
+
+    # For every "brief" statement at the start of a comment block, add an
+    # xref with whatever is on the same line. This gives us an index page
+    # with all the API methods in one place.
+    # XXX Commented out for now; works but duplicates the brief text in the
+    # struct documentation
+    #( re.compile(r"/\*\*\s*(?P<b>[\\@]brief)\s+(?P<c>.+)(\*/)$"), r'/** @xrefitem api "" "VPP API" \g<c> \g<b> \g<c>'),  # capture inline comment close
+    #( re.compile(r"/\*\*\s*(?P<b>[\\@]brief)\s+(?P<c>.+)$"), r'/** @xrefitem api "" "VPP API" \g<c> \g<b> \g<c>'),
+
+    # Since structs don't have params, replace @param with @tparam
+    ( re.compile("[\\@]param\\b"), "@tparam"),
+]
+
+with open(sys.argv[1]) as fd:
+    for line in fd:
+        str = line[:-1] # strip \n
+        for p in patterns:
+            str = p[0].sub(p[1], str)
+        sys.stdout.write(str+"\n")
diff --git a/doxygen/filter_c.py b/doxygen/filter_c.py
index 5a812a5..db1681c 100755
--- a/doxygen/filter_c.py
+++ b/doxygen/filter_c.py
@@ -1,4 +1,19 @@
 #!/usr/bin/env python
+# Copyright (c) 2016 Comcast Cable Communications Management, LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Filter for .c files to make various preprocessor tricks Doxygenish
 
 import sys, re
 
@@ -31,7 +46,7 @@
 
 with open(sys.argv[1]) as fd:
     for line in fd:
-        str = line
+        str = line[:-1] # filter \n
         for p in patterns:
             str = p[0].sub(p[1], str)
-        sys.stdout.write(str)
+        sys.stdout.write(str+"\n")