summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build-aux/pmccabe.css227
-rwxr-xr-xbuild-aux/pmccabe2html908
-rw-r--r--configure.ac49
-rw-r--r--doc/Makefile.am2
-rw-r--r--doc/cyclo/Makefile.am33
-rw-r--r--gl/Makefile.am11
-rw-r--r--gl/m4/gnulib-cache.m43
-rw-r--r--gl/m4/gnulib-comp.m44
-rw-r--r--gl/m4/pmccabe2html.m414
-rw-r--r--gl/sys_stat.in.h12
10 files changed, 1244 insertions, 19 deletions
diff --git a/build-aux/pmccabe.css b/build-aux/pmccabe.css
new file mode 100644
index 0000000000..2d94c91c75
--- /dev/null
+++ b/build-aux/pmccabe.css
@@ -0,0 +1,227 @@
+body {
+
+ font-family: Helvetica, sans-serif;
+
+}
+
+.page_title {
+
+ font: 18pt Georgia, serif;
+/* font-size: 1.5em;
+ font-weight: bold; */
+ color: darkred;
+ border-bottom: 2px solid darkred;
+}
+
+.section_title {
+
+ font: 14pt Georgia, serif;
+ color: darkred;
+ border-bottom: 2px dashed darkred;
+}
+
+.report_timestamp {
+
+ color: darkred;
+ font-weight: bold;
+
+}
+
+.function_src {
+
+ text-align: left;
+ background: white;
+}
+
+.resume_table {
+
+}
+
+.resume_header_entry {
+
+ color: black;
+}
+
+.resume_number_entry {
+
+ color: darkred;
+ font-weight: bold;
+ text-align: right;
+}
+
+.ranges_table {
+
+ border-spacing: 0px;
+ border-bottom: solid 2px black;
+ border-top: solid 2px black;
+ border-left: solid 2px black;
+ border-right: solid 2px black;
+}
+
+.ranges_header_entry {
+
+ padding: 5px;
+ border-bottom: solid 1px black;
+ font-size: 1em;
+ font-weight: bold;
+ color: darkred;
+ text-align: left;
+}
+
+.ranges_entry {
+
+}
+
+.ranges_entry_simple {
+
+ background: #87ff75;
+
+}
+
+.ranges_entry_moderate {
+
+ background: #fffc60;
+
+}
+
+.ranges_entry_high {
+
+ background: #ff5a5d;
+
+}
+
+.ranges_entry_untestable {
+
+ background: #993300
+
+}
+
+
+.function_table {
+
+ border-spacing: 0px;
+ border-bottom: solid 2px black;
+ border-top: solid 2px black;
+ border-left: solid 2px black;
+ border-right: solid 2px black;
+}
+
+.function_table_caption {
+
+ font-size: 1.1em;
+ font-weight: bold;
+ color: black;
+ padding: 5px;
+}
+
+.function_table_header {
+
+}
+
+
+.function_table_header_entry {
+
+ padding: 5px;
+ border-bottom: solid 1px black;
+ font-size: 1em;
+ font-weight: bold;
+ color: darkred;
+ text-align: left;
+}
+
+.function_entry {
+
+
+}
+
+
+.function_entry_simple {
+
+ background: #87ff75;
+
+}
+
+.function_entry_moderate {
+
+ background: #fffc60;
+
+}
+
+.function_entry_high {
+
+ background: #ff5a5d;
+
+}
+
+.function_entry_untestable {
+
+ background: #993300
+
+}
+
+
+.function_entry_name {
+
+ font-size: 1em;
+ text-align: left;
+ font-weight: bold;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_cyclo {
+
+ font-size: 1em;
+ text-align: right;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_number {
+
+ font-size: 1em;
+ text-align: right;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.function_entry_filename {
+
+ font-size: 1em;
+ text-align: left;
+ text-valign: top;
+
+ border-top: solid 1px black;
+ padding: 3px;
+}
+
+.sidemenu {
+
+ border: 1px black solid;
+ padding: 5px;
+
+}
+
+.sidemenuheader {
+
+ color: darkred;
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 1px dashed darkred;
+}
+
+.sidemenuentry {
+
+
+}
+
+.menu {
+
+}
+
diff --git a/build-aux/pmccabe2html b/build-aux/pmccabe2html
new file mode 100755
index 0000000000..27bb8f3539
--- /dev/null
+++ b/build-aux/pmccabe2html
@@ -0,0 +1,908 @@
+#!/usr/bin/awk -f
+# pmccabe2html - pmccabe to html converter
+
+# Copyright (C) 2007, 2008 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Written by Jose E. Marchesi <jemarch@gnu.org>.
+# Adapted for gnulib by Simon Josefsson <simon@josefsson.org>.
+# Added support for C++ by Giuseppe Scrivano <gscrivano@gnu.org>.
+
+# Typical Invocation is from a Makefile.am:
+#
+# cyclo-libidn.html:
+# $(PMCCABE) ${top_srcdir}/lib/*.[ch] \
+# | sort -nr \
+# | $(AWK) -f ${top_srcdir}/build-aux/pmccabe2html \
+# -v lang=html -v name="$(PACKAGE_NAME)" \
+# -v vcurl="http://git.savannah.gnu.org/gitweb/?p=libidn.git;a=blob;f=%FILENAME%;hb=HEAD" \
+# -v url="http://www.gnu.org/software/libidn/" \
+# -v css=../../build-aux/pmccabe.css \
+# > tmp
+# mv tmp $@
+#
+# The variables available are:
+# lang output language, either 'html' or 'wiki'
+# name project name
+# url link to project's home page
+# vcurl URL to version controlled source code browser,
+# a %FILENAME% in the string is replaced with the relative
+# source filename
+# css CSS stylesheet filename, included verbatim in HTML output
+# css_url link to CSS stylesheet, an URL
+
+# Prologue & configuration
+BEGIN {
+ section_global_stats_p = 1
+ section_function_cyclo_p = 1
+
+ # "html" or "wiki"
+ package_name = name
+ output_lang = lang
+
+ # General Options
+ cyclo_simple_max = 10
+ cyclo_moderate_max = 20
+ cyclo_high_max = 50
+ cut_dir = "/../"
+ source_file_link_tmpl = vcurl
+
+ # HTML options
+ if (url != "")
+ {
+ html_prolog = "<a href=\"" url "\">Back to " package_name " Homepage</a><br/><br/>"
+ }
+ html_epilog = "<hr color=\"black\" size=\"2\"/> \
+Copyright (c) 2007, 2008 Free Software Foundation Inc."
+ html_doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \
+\"http://www.w3.org/TR/html401/loose.dtd\">"
+ html_comment = "<!-- Generated by gnulib's pmccabe2html at " systime() " -->"
+ html_title = "Cyclomatic Complexity report for " package_name
+
+ # Wiki options
+ wiki_prolog = "{{Note|This page has been automatically generated}}"
+ wiki_epilog = ""
+
+ # Internal variables
+ nfuncs = 0;
+}
+
+# Functions
+
+function build_stats()
+{
+ # Maximum modified cyclo
+ for (fcn in mcyclo)
+ {
+ num_of_functions++
+ if (mcyclo[fcn] > max_mcyclo)
+ {
+ max_mcyclo = mcyclo[fcn]
+ }
+
+ if (mcyclo[fcn] > cyclo_high_max)
+ {
+ num_of_untestable_functions++
+ }
+ else if (mcyclo[fcn] > cyclo_moderate_max)
+ {
+ num_of_high_functions++
+ }
+ else if (mcyclo[fcn] > cyclo_simple_max)
+ {
+ num_of_moderate_functions++
+ }
+ else
+ {
+ num_of_simple_functions++
+ }
+ }
+}
+
+function html_fnc_table_complete (caption)
+{
+ html_fnc_table(caption, 1, 0, 1, 1, 1, 0, 1)
+}
+
+function html_fnc_table_abbrev (caption)
+{
+ html_fnc_table(caption, 1, 0, 1, 0, 1, 0, 0)
+}
+
+
+function html_fnc_table (caption,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ print "<table width=\"90%\" class=\"function_table\" cellpadding=\"0\" cellspacing=\"0\">"
+ if (caption != "")
+ {
+ print "<caption class=\"function_table_caption\">" caption "</caption>"
+ }
+ html_fnc_header(fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ for (nfnc = 1; nfnc < nfuncs; nfnc++)
+ {
+ html_fnc(nfnc,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ }
+ print "</table>"
+}
+
+function html_header ()
+{
+ print html_doctype
+ print "<html>"
+ print html_comment
+ print "<head>"
+ print "<title>" html_title "</title>"
+ print ""
+ print "<meta name=\"description\" content=\"" html_title "\">"
+ print "<meta name=\"keywords\" content=\"" html_title "\">"
+ print "<meta name=\"resource-type\" content=\"document\">"
+ print "<meta name=\"distribution\" content=\"global\">"
+ print "<meta name=\"Generator\" content=\"pmccabe2html\">"
+ print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
+ print "<script language=\"javascript\" type=\"text/javascript\">"
+ print "function show_hide(idCapa, idButton, fuerzaVisibilidad)\
+{\
+ var button = document.getElementById(idButton);\
+ var capa = document.getElementById(idCapa);\
+ if (capa)\
+ {\
+ if (fuerzaVisibilidad && fuerzaVisibilidad!=\"\") {\
+ if (fuerzaVisibilidad==\"visible\") capa.style.display=\"\";\
+ else capa.style.display=\"none\";\
+ }\
+ else\
+ {\
+ if (capa.style.display == \"none\") {\
+ capa.style.display = \"\";\
+ button.innerHTML = \"&uarr;\";\
+ } else {\
+ capa.style.display = \"none\";\
+ button.innerHTML = \"&darr;\"; \
+ }\
+ }\
+ }\
+}"
+ print "</script>"
+
+
+ if (css_url != "")
+ {
+ print "<link rel=\"stylesheet\" href=\"" css_url "\" type =\"text/css\" media=\"screen\"/>"
+ }
+ if (css != "")
+ {
+ print "<style type =\"text/css\" media=\"screen\">"
+ print "<!--"
+ while ((getline cssline < css) > 0)
+ {
+ print cssline
+ }
+ print "-->"
+ print "</style />"
+ close(css)
+ }
+ print "</head>"
+ print "<body lang=\"en\" bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\" \
+vlink=\"#800080\" alink=\"#FF0000\">"
+}
+
+function html_footer ()
+{
+ print "</body>"
+ print "</html>"
+}
+
+function html_fnc_header (fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ print "<tr class=\"function_table_header\">"
+ if (fname_p)
+ {
+ # Function name
+ print "<td class=\"function_table_header_entry\">"
+ print ""
+ print "</td>"
+
+ print "<td class=\"function_table_header_entry\">"
+ print "Function Name"
+ print "</td>"
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "<td class=\"function_table_header_entry\">"
+ print "Modified Cyclo"
+ print "</td>"
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "<td class=\"function_table_header_entry\">"
+ print "Cyclomatic"
+ print "<br/>"
+ print "Complexity"
+ print "</td>"
+ }
+ if (num_statements_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "Number of"
+ print "<br/>"
+ print "Statements"
+ print "</td>"
+ }
+ if (num_lines_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "Number of"
+ print "<br/>"
+ print "Lines"
+ print "</td>"
+ }
+ if (first_line_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "First Line"
+ print "</td>"
+ }
+ if (file_p)
+ {
+ print "<td class=\"function_table_header_entry\">"
+ print "Source File"
+ print "</td>"
+
+ }
+ print "</tr>"
+}
+
+function html_fnc (nfun,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ fname = fnames[nfun]
+
+ # Function name
+ trclass = "function_entry_simple"
+ if (mcyclo[nfun] > cyclo_high_max)
+ {
+ trclass="function_entry_untestable"
+ }
+ else if (mcyclo[nfun] > cyclo_moderate_max)
+ {
+ trclass="function_entry_high"
+ }
+ else if (mcyclo[nfun] > cyclo_simple_max)
+ {
+ trclass="function_entry_moderate"
+ }
+
+ print "<tr class=\"" trclass "\">"
+ if (fname_p)
+ {
+ print "<td class=\"function_entry_filename\">"
+ if (file_p && mcyclo[nfun] > cyclo_simple_max)
+ {
+ print "<a href=\"javascript:void(0);\" title=\"show/hide function source\" onClick=\"javascript:show_hide('" fname "_src', '" fname "_button')\">\
+<span id=\"" fname "_button\">&darr;</span></a>"
+ }
+ else
+ {
+ print "&nbsp;"
+ }
+ print "</td>"
+
+ print "<td class=\"function_entry_name\">"
+ print fname
+ print "</td>"
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "<td class=\"function_entry_cyclo\">"
+ print mcyclo[nfun]
+ print "</td>"
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "<td class=\"function_entry_cyclo\">"
+ print cyclo[nfun]
+ print "</td>"
+ }
+ if (num_statements_p)
+ {
+ # Number of statements
+ print "<td class=\"function_entry_number\">"
+ print num_statements[nfun]
+ print "</td>"
+ }
+ if (num_lines_p)
+ {
+ # Number of lines
+ print "<td class=\"function_entry_number\">"
+ print num_lines[nfun]
+ print "</td>"
+ }
+ if (first_line_p)
+ {
+ # First line
+ print "<td class=\"function_entry_number\">"
+ print first_line[nfun]
+ print "</td>"
+ }
+ if (file_p)
+ {
+ href = ""
+ if (source_file_link_tmpl != "")
+ {
+ # Get href target
+ href = source_file_link_tmpl
+ sub(/%FILENAME%/, file[nfun], href)
+ }
+
+ # Source file
+ print "<td class=\"function_entry_filename\">"
+ if (href != "")
+ {
+ print "<a href=\"" href "\">" file[nfun] "</a>"
+ }
+ else
+ {
+ print file[nfun]
+ }
+
+ print "</td>"
+
+
+ print "</tr>"
+
+ if (mcyclo[nfun] > cyclo_simple_max)
+ {
+ print "<tr>"
+
+ num_columns = 1;
+ if (fname_p) { num_columns++ }
+ if (mcyclo_p) { num_columns++ }
+ if (cyclo_p) { num_columns++ }
+ if (num_statements_p) { num_columns++ }
+ if (num_lines_p) { num_columns++ }
+ if (first_line_p) { num_columns++ }
+ if (file_p) { num_columns++ }
+
+ print "<td colspan=\"" num_columns "\" height=\"0\">"
+ print "<div id=\"" fname "_src\" class=\"function_src\" style=\"position: relative; display: none;\">"
+ print "<pre class=\"function_src\">"
+
+ while ((getline codeline < (fname nfun "_fn.txt")) > 0)
+ {
+ sub(/\\</, "&lt;", codeline)
+ sub(/\\>/, "&gt;", codeline)
+ sub(/&/, "&amp;", codeline)
+
+ print codeline
+ }
+ close(fname nfun "_fn.txt")
+ system("rm " fname nfun "_fn.txt")
+ print "</pre>"
+ print "</div>"
+ print "</td>"
+ print "</tr>"
+ }
+
+ }
+}
+
+function html_global_stats ()
+{
+ print "<div class=\"section_title\">Resume</div>"
+
+ print "<br/>"
+ print "<table class=\"resume_table\">"
+ # Total number of functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Total number of functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_functions
+ print "</td>"
+ print "</tr>"
+ # Number of simple functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of low risk functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_simple_functions
+ print "</td>"
+ print "</tr>"
+ # Number of moderate functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of moderate risk functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_moderate_functions
+ print "</td>"
+ print "</tr>"
+ # Number of high functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of high risk functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_high_functions
+ print "</td>"
+ print "</tr>"
+ # Number of untestable functions
+ print "<tr>"
+ print "<td class=\"resume_header_entry\">"
+ print "Number of untestable functions"
+ print "</td>"
+ print "<td class=\"resume_number_entry\">"
+ print num_of_untestable_functions
+ print "</td>"
+ print "</tr>"
+ print "</table>"
+ print "<br/>"
+}
+
+function html_function_cyclo ()
+{
+ print "<div class=\"section_title\">Details for all functions</div>"
+ print "<p>Used ranges:</p>"
+
+ print "<table class=\"ranges_table\">"
+ print "<tr>"
+ print "<td class=\"ranges_header_entry\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_header_entry\">"
+ print "Cyclomatic Complexity"
+ print "</td>"
+ print "<td class=\"ranges_header_entry\">"
+ print "Risk Evaluation"
+ print "</td>"
+ print "</tr>"
+ # Simple
+ print "<tr>"
+ print "<td class=\"ranges_entry_simple\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "0 - " cyclo_simple_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "Simple module, without much risk"
+ print "</td>"
+ print "</tr>"
+ # Moderate
+ print "<tr>"
+ print "<td class=\"ranges_entry_moderate\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print cyclo_simple_max + 1 " - " cyclo_moderate_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "More complex module, moderate risk"
+ print "</td>"
+ print "</tr>"
+ # High
+ print "<tr>"
+ print "<td class=\"ranges_entry_high\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print cyclo_moderate_max + 1 " - " cyclo_high_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "Complex module, high risk"
+ print "</td>"
+ print "</tr>"
+ # Untestable
+ print "<tr>"
+ print "<td class=\"ranges_entry_untestable\">"
+ print "&nbsp;"
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "greater than " cyclo_high_max
+ print "</td>"
+ print "<td class=\"ranges_entry\">"
+ print "Untestable module, very high risk"
+ print "</td>"
+ print "</tr>"
+ print "</table>"
+ print "<br/>"
+ html_fnc_table_complete("")
+}
+
+function wiki_global_stats ()
+{
+ print "{| class=\"cyclo_resume_table\""
+ # Total number of functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Total number of functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_functions
+ # Number of simple functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of low risk functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_simple_functions
+ # Number of moderate functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of moderate risk functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_moderate_functions
+ # Number of high functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of high risk functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_high_functions
+ # Number of untestable functions
+ print "|-"
+ print "| class=\"cyclo_resume_header_entry\" | Number of untestable functions"
+ print "| class=\"cyclo_resume_number_entry\" |" num_of_untestable_functions
+ print "|}"
+}
+
+function wiki_function_cyclo ()
+{
+ print "==Details for all functions=="
+
+ print "Used ranges:"
+
+ print "{| class =\"cyclo_ranges_table\""
+ print "|-"
+ print "| class=\"cyclo_ranges_header_entry\" | "
+ print "| class=\"cyclo_ranges_header_entry\" | Cyclomatic Complexity"
+ print "| class=\"cyclo_ranges_header_entry\" | Risk Evaluation"
+ # Simple
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_simple\" | "
+ print "| class=\"cyclo_ranges_entry\" | 0 - " cyclo_simple_max
+ print "| class=\"cyclo_ranges_entry\" | Simple module, without much risk"
+ # Moderate
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_moderate\" | "
+ print "| class=\"cyclo_ranges_entry\" |" cyclo_simple_max + 1 " - " cyclo_moderate_max
+ print "| class=\"cyclo_ranges_entry\" | More complex module, moderate risk"
+ # High
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_high\" | "
+ print "| class=\"cyclo_ranges_entry\" |" cyclo_moderate_max + 1 " - " cyclo_high_max
+ print "| class=\"cyclo_ranges_entry\" | Complex module, high risk"
+ # Untestable
+ print "|-"
+ print "| class=\"cyclo_ranges_entry_untestable\" | "
+ print "| class=\"cyclo_ranges_entry\" | greater than " cyclo_high_max
+ print "| class=\"cyclo_ranges_entry\" | Untestable module, very high risk"
+ print "|}"
+
+ print ""
+ print ""
+ wiki_fnc_table_complete("")
+}
+
+function wiki_fnc_table_complete (caption)
+{
+ wiki_fnc_table(caption, 1, 0, 1, 1, 1, 0, 1)
+}
+
+function wiki_fnc_table_abbrev (caption)
+{
+ wiki_fnc_table(caption, 1, 0, 0, 0, 0, 0, 0)
+}
+
+function wiki_fnc_table (caption,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ print "{| width=\"90%\" class=\"cyclo_function_table\" cellpadding=\"0\" cellspacing=\"0\">"
+ if (caption != "")
+ {
+ print "|+" caption
+ }
+ wiki_fnc_header(fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ for (nfnc = 1; nfnc < nfuncs; nfnc++)
+ {
+ wiki_fnc(nfnc,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+ }
+ print "|}"
+}
+
+function wiki_fnc_header (fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ if (fname_p)
+ {
+ # Function name
+ print "! class=\"cyclo_function_table_header_entry\" | Function Name"
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "! class=\"cyclo_function_table_header_entry\" | Modified Cyclo"
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "! class=\"cyclo_function_table_header_entry\" | Cyclomatic Complexity"
+ }
+ if (num_statements_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | Number of Statements"
+ }
+ if (num_lines_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | Number of Lines"
+ }
+ if (first_line_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | First Line"
+ }
+ if (file_p)
+ {
+ print "! class=\"cyclo_function_table_header_entry\" | Source File"
+ }
+}
+
+function wiki_fnc (nfnc,
+ fname_p,
+ mcyclo_p,
+ cyclo_p,
+ num_statements_p,
+ num_lines_p,
+ first_line_p,
+ file_p)
+{
+ fname = fnames[nfnc]
+
+ # Function name
+ trclass = "cyclo_function_entry_simple"
+ if (mcyclo[nfnc] > cyclo_high_max)
+ {
+ trclass="cyclo_function_entry_untestable"
+ }
+ else if (mcyclo[nfnc] > cyclo_moderate_max)
+ {
+ trclass="cyclo_function_entry_high"
+ }
+ else if (mcyclo[nfnc] > cyclo_simple_max)
+ {
+ trclass="cyclo_function_entry_moderate"
+ }
+
+ print "|- class=\"" trclass "\""
+ if (fname_p)
+ {
+ print "| class=\"cyclo_function_entry_name\" |" fname
+ }
+ if (mcyclo_p)
+ {
+ # Modified cyclo
+ print "| class=\"cyclo_function_entry_cyclo\" |" mcyclo[nfnc]
+ }
+ if (cyclo_p)
+ {
+ # Cyclo
+ print "| class=\"cyclo_function_entry_cyclo\" |" cyclo[nfnc]
+ }
+ if (num_statements_p)
+ {
+ # Number of statements
+ print "| class=\"cyclo_function_entry_number\" |" num_statements[nfnc]
+ }
+ if (num_lines_p)
+ {
+ # Number of lines
+ print "| class=\"cyclo_function_entry_number\" |" num_lines[nfnc]
+ }
+ if (first_line_p)
+ {
+ # First line
+ print "| class=\"cyclo_function_entry_number\" |" first_line[nfnc]
+ }
+ if (file_p)
+ {
+ href = ""
+ if (source_file_link_tmpl != "")
+ {
+ # Get href target
+ href = source_file_link_tmpl
+ sub(/%FILENAME%/, file[nfnc], href)
+ }
+
+ # Source file
+ print "| class=\"cyclo_function_entry_filename\" |" \
+ ((href != "") ? "[" href " " file[nfnc] "]" : "[" file[nfnc] "]")
+ }
+}
+
+# Scan data from a line
+{
+ function_name = $7
+
+ nfuncs++;
+ fnames[nfuncs] = function_name
+ mcyclo[nfuncs] = $1
+ cyclo[nfuncs] = $2
+ num_statements[nfuncs] = $3
+ first_line[nfuncs] = $4
+ num_lines[nfuncs] = $5
+
+ # Build the filename from the file_spec ($6)
+ begin_util_path = index($6, cut_dir)
+ tmpfilename = substr($6, begin_util_path + length(cut_dir))
+ sub(/\([0-9]+\):/, "", tmpfilename)
+ file[nfuncs] = tmpfilename
+
+ if (mcyclo[nfuncs] > cyclo_simple_max)
+ {
+ # Extract function contents to a fn_txt file
+ filepath = $6
+
+ sub(/\([0-9]+\):/, "", filepath)
+ num_line = 0
+
+ while ((getline codeline < filepath) > 0)
+ {
+ num_line++;
+ if ((num_line >= first_line[nfuncs]) &&
+ (num_line < first_line[nfuncs] + num_lines[nfuncs]))
+ {
+ print codeline > (function_name nfuncs "_fn.txt")
+ }
+ }
+ close (function_name nfuncs "_fn.txt")
+ close(filepath)
+ }
+
+ # Initial values for statistics variables
+ num_of_functions = 0
+ max_mcyclo = 0
+ max_function_length = 0
+ num_of_simple_functions = 0
+ num_of_moderate_functions = 0
+ num_of_high_functions = 0
+ num_of_untestable_functions = 0
+}
+
+# Epilogue
+END {
+ # Print header (only for html)
+ if (output_lang == "html")
+ {
+ html_header()
+ }
+
+ # Print prolog
+ if ((output_lang == "html") &&
+ (html_prolog != ""))
+ {
+ print html_prolog
+ }
+ if ((output_lang == "wiki") &&
+ (wiki_prolog != ""))
+ {
+ print wiki_prolog
+ }
+
+ if (output_lang == "html")
+ {
+ print "<div class=\"page_title\">" package_name " Cyclomatic Complexity Report</div>"
+ print "<p>Report generated at: <span class=\"report_timestamp\">" strftime() "</div></p>"
+ }
+ if (output_lang == "wiki")
+ {
+ print "==" package_name " Cyclomatic Complexity Report=="
+ print "Report generated at: '''" strftime() "'''"
+ }
+
+ if (section_global_stats_p)
+ {
+ build_stats()
+
+ if (output_lang == "html")
+ {
+ html_global_stats()
+ }
+ if (output_lang == "wiki")
+ {
+ wiki_global_stats()
+ }
+ }
+ if (section_function_cyclo_p)
+ {
+ if (output_lang == "html")
+ {
+ html_function_cyclo()
+ }
+ if (output_lang == "wiki")
+ {
+ wiki_function_cyclo()
+ }
+ }
+
+ # Print epilog
+ if ((output_lang == "html") &&
+ (html_epilog != ""))
+ {
+ print html_epilog
+ }
+ if ((output_lang == "wiki") &&
+ (wiki_epilog != ""))
+ {
+ print wiki_epilog
+ }
+
+ # Print footer (html only)
+ if (output_lang == "html")
+ {
+ html_footer()
+ }
+}
+
+# End of pmccabe2html
diff --git a/configure.ac b/configure.ac
index 521e2283f5..0b48e9a5b3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -256,21 +256,40 @@ AC_PROG_LIBTOOL
AC_CONFIG_SUBDIRS([lib])
AC_CONFIG_SUBDIRS([libextra])
-AC_CONFIG_FILES([Makefile \
- doc/Makefile doc/examples/Makefile doc/scripts/Makefile \
- doc/manpages/Makefile doc/reference/Makefile doc/doxygen/Doxyfile \
- doc/credentials/Makefile doc/credentials/x509/Makefile \
- doc/credentials/srp/Makefile doc/credentials/openpgp/Makefile \
- gl/Makefile gl/tests/Makefile \
- tests/Makefile tests/rsa-md5-collision/Makefile tests/userid/Makefile \
- tests/pkcs1-padding/Makefile tests/pkcs8-decode/Makefile \
- tests/pkcs12-decode/Makefile tests/pathlen/Makefile \
- tests/key-id/Makefile tests/sha2/Makefile \
- tests/openpgp-certs/Makefile \
- src/Makefile \
- src/cfg/Makefile src/cfg/platon/Makefile src/cfg/platon/str/Makefile \
- guile/Makefile guile/modules/Makefile \
- guile/src/Makefile guile/tests/Makefile])
+AC_CONFIG_FILES([ \
+ Makefile \
+ doc/Makefile \
+ doc/examples/Makefile \
+ doc/cyclo/Makefile \
+ doc/scripts/Makefile \
+ doc/manpages/Makefile \
+ doc/reference/Makefile \
+ doc/doxygen/Doxyfile \
+ doc/credentials/Makefile \
+ doc/credentials/x509/Makefile \
+ doc/credentials/srp/Makefile \
+ doc/credentials/openpgp/Makefile \
+ gl/Makefile \
+ gl/tests/Makefile \
+ tests/Makefile \
+ tests/rsa-md5-collision/Makefile \
+ tests/userid/Makefile \
+ tests/pkcs1-padding/Makefile \
+ tests/pkcs8-decode/Makefile \
+ tests/pkcs12-decode/Makefile \
+ tests/pathlen/Makefile \
+ tests/key-id/Makefile \
+ tests/sha2/Makefile \
+ tests/openpgp-certs/Makefile \
+ src/Makefile \
+ src/cfg/Makefile \
+ src/cfg/platon/Makefile \
+ src/cfg/platon/str/Makefile \
+ guile/Makefile \
+ guile/modules/Makefile \
+ guile/src/Makefile \
+ guile/tests/Makefile \
+])
AC_CONFIG_FILES([guile/pre-inst-guile], [chmod +x guile/pre-inst-guile])
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 60c3797363..6362a98010 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -23,7 +23,7 @@ EXTRA_DIST = TODO README.GIT README.autoconf certtool.cfg gnutls.ps \
gnutls.pdf gnutls.html extract-guile-c-doc.scm \
doxygen/Doxyfile.in doxygen/Doxyfile.orig texinfo.css
-SUBDIRS = examples scripts manpages credentials
+SUBDIRS = examples cyclo scripts manpages credentials
if ENABLE_GTK_DOC
SUBDIRS += reference
endif
diff --git a/doc/cyclo/Makefile.am b/doc/cyclo/Makefile.am
new file mode 100644
index 0000000000..7f6ebddb26
--- /dev/null
+++ b/doc/cyclo/Makefile.am
@@ -0,0 +1,33 @@
+## Process this file with automake to produce Makefile.in
+# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation
+#
+# Author: Simon Josefsson
+#
+# This file is part of GNUTLS.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+EXTRA_DIST = cyclo-gnutls.html
+
+cyclo-gnutls.html:
+ $(PMCCABE) ${top_srcdir}/lib/*.[ch] \
+ | sort -nr \
+ | $(AWK) -f ${top_srcdir}/build-aux/pmccabe2html \
+ -v lang=html -v name="$(PACKAGE_NAME)" \
+ -v vcurl="http://git.savannah.gnu.org/gitweb/?p=gnutls.git;a=blob;f=%FILENAME%;hb=HEAD" \
+ -v url="http://www.gnu.org/software/gnutls/" \
+ -v css=../../build-aux/pmccabe.css \
+ > tmp
+ mv tmp $@
diff --git a/gl/Makefile.am b/gl/Makefile.am
index e7409ad48d..56485911d8 100644
--- a/gl/Makefile.am
+++ b/gl/Makefile.am
@@ -9,7 +9,7 @@
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --with-tests --libtool --macro-prefix=gl --no-vc-files accept arpa_inet autobuild bind close connect error fdl-1.3 gendocs getaddrinfo getline getpass-gnu gnupload gpl-3.0 inet_ntop inet_pton lgpl-2.1 listen maintainer-makefile minmax perror progname read-file readline recv select send setsockopt shutdown socket sys_stat version-etc-fsf
+# Reproduce by: gnulib-tool --import --dir=. --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --with-tests --libtool --macro-prefix=gl --no-vc-files accept arpa_inet autobuild bind close connect error fdl-1.3 gendocs getaddrinfo getline getpass-gnu gnupload gpl-3.0 inet_ntop inet_pton lgpl-2.1 listen maintainer-makefile minmax perror pmccabe2html progname read-file readline recv select send setsockopt shutdown socket sys_stat version-etc-fsf
AUTOMAKE_OPTIONS = 1.5 gnits
@@ -122,7 +122,7 @@ libgnu_la_SOURCES += c-ctype.h c-ctype.c
## begin gnulib module close
-EXTRA_DIST += close.c
+EXTRA_DIST += close.c w32sock.h
EXTRA_libgnu_la_SOURCES += close.c
@@ -404,6 +404,13 @@ EXTRA_libgnu_la_SOURCES += perror.c
## end gnulib module perror
+## begin gnulib module pmccabe2html
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/pmccabe2html $(top_srcdir)/build-aux/pmccabe.css
+
+## end gnulib module pmccabe2html
+
## begin gnulib module progname
libgnu_la_SOURCES += progname.h progname.c
diff --git a/gl/m4/gnulib-cache.m4 b/gl/m4/gnulib-cache.m4
index 96a26cbee2..6fc3e49663 100644
--- a/gl/m4/gnulib-cache.m4
+++ b/gl/m4/gnulib-cache.m4
@@ -15,7 +15,7 @@
# Specification in the form of a command-line invocation:
-# gnulib-tool --import --dir=. --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --with-tests --libtool --macro-prefix=gl --no-vc-files accept arpa_inet autobuild bind close connect error fdl-1.3 gendocs getaddrinfo getline getpass-gnu gnupload gpl-3.0 inet_ntop inet_pton lgpl-2.1 listen maintainer-makefile minmax perror progname read-file readline recv select send setsockopt shutdown socket sys_stat version-etc-fsf
+# gnulib-tool --import --dir=. --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --with-tests --libtool --macro-prefix=gl --no-vc-files accept arpa_inet autobuild bind close connect error fdl-1.3 gendocs getaddrinfo getline getpass-gnu gnupload gpl-3.0 inet_ntop inet_pton lgpl-2.1 listen maintainer-makefile minmax perror pmccabe2html progname read-file readline recv select send setsockopt shutdown socket sys_stat version-etc-fsf
# Specification in the form of a few gnulib-tool.m4 macro invocations:
gl_LOCAL_DIR([gl/override])
@@ -41,6 +41,7 @@ gl_MODULES([
maintainer-makefile
minmax
perror
+ pmccabe2html
progname
read-file
readline
diff --git a/gl/m4/gnulib-comp.m4 b/gl/m4/gnulib-comp.m4
index 7dcff38956..dca40d50c4 100644
--- a/gl/m4/gnulib-comp.m4
+++ b/gl/m4/gnulib-comp.m4
@@ -119,6 +119,7 @@ AC_SUBST([LTALLOCA])
AC_PROG_MKDIR_P
gl_FUNC_PERROR
gl_STRING_MODULE_INDICATOR([perror])
+ gl_PMCCABE2HTML
gl_FUNC_READ_FILE
gl_FUNC_READLINE
gl_FUNC_REALLOC_POSIX
@@ -325,6 +326,8 @@ AC_DEFUN([gl_FILE_LIST], [
build-aux/gendocs.sh
build-aux/gnupload
build-aux/link-warning.h
+ build-aux/pmccabe.css
+ build-aux/pmccabe2html
doc/fdl-1.3.texi
doc/gendocs_template
doc/gpl-3.0.texi
@@ -433,6 +436,7 @@ AC_DEFUN([gl_FILE_LIST], [
m4/netdb_h.m4
m4/netinet_in_h.m4
m4/perror.m4
+ m4/pmccabe2html.m4
m4/printf.m4
m4/read-file.m4
m4/readline.m4
diff --git a/gl/m4/pmccabe2html.m4 b/gl/m4/pmccabe2html.m4
new file mode 100644
index 0000000000..5e207422d3
--- /dev/null
+++ b/gl/m4/pmccabe2html.m4
@@ -0,0 +1,14 @@
+# pmccabe2html.m4 serial 1
+dnl Copyright (C) 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# Usage: gl_PMCCABE2HTML([]).
+AC_DEFUN([gl_PMCCABE2HTML],
+[
+ AC_PROG_AWK
+ AC_PATH_PROG([PMCCABE], [pmccabe], [false])
+])
diff --git a/gl/sys_stat.in.h b/gl/sys_stat.in.h
index 1a900a495f..3748c261c8 100644
--- a/gl/sys_stat.in.h
+++ b/gl/sys_stat.in.h
@@ -275,6 +275,12 @@
# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
#if @GNULIB_LSTAT@
# if ! @HAVE_LSTAT@
/* mingw does not support symlinks, therefore it does not have lstat. But
@@ -341,6 +347,12 @@ extern int lchmod (const char *filename, mode_t mode);
lchmod (f, m))
#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
#endif /* _GL_SYS_STAT_H */
#endif /* _GL_SYS_STAT_H */
#endif