| # pmccabe2html - AWK script to convert pmccabe output to html -*- awk -*- | |
| # Copyright (C) 2007-2017 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_SOURCES = ${top_srcdir}/src/*.[ch] | |
| # | |
| # cyclo-$(PACKAGE).html: $(CYCLO_SOURCES) | |
| # $(PMCCABE) $(CYCLO_SOURCES) \ | |
| # | 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=$(PACKAGE).git;a=blob;f=%FILENAME%;hb=HEAD" \ | |
| # -v url="http://www.gnu.org/software/$(PACKAGE)/" \ | |
| # -v css=${top_srcdir}/build-aux/pmccabe.css \ | |
| # -v cut_dir=${top_srcdir}/ \ | |
| # > $@-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 { | |
| # Portable lookup of present time. | |
| "date +%s" | getline epoch_time | |
| "date" | getline chronos_time | |
| 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 | |
| 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 " epoch_time " -->" | |
| 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, 1, 0, 1, 1, 0, 1) | |
| } | |
| function html_fnc_table_abbrev (caption) | |
| { | |
| html_fnc_table(caption, 1, 1, 0, 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 = \"↑\";\ | |
| } else {\ | |
| capa.style.display = \"none\";\ | |
| button.innerHTML = \"↓\"; \ | |
| }\ | |
| }\ | |
| }\ | |
| }" | |
| 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\">↓</span></a>" | |
| } | |
| else | |
| { | |
| print " " | |
| } | |
| 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) | |
| { | |
| gsub(/&/, "\\&", codeline) # Must come first. | |
| gsub(/</, "\\<", codeline) | |
| gsub(/>/, "\\>", 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\">Summary</div>" | |
| print "<table class=\"summary_table\">" | |
| # Total number of functions | |
| print "<tr>" | |
| print "<td class=\"summary_header_entry\">" | |
| print "Total number of functions" | |
| print "</td>" | |
| print "<td class=\"summary_number_entry\">" | |
| print num_of_functions | |
| print "</td>" | |
| print "</tr>" | |
| # Number of simple functions | |
| print "<tr>" | |
| print "<td class=\"summary_header_entry\">" | |
| print "Number of low risk functions" | |
| print "</td>" | |
| print "<td class=\"summary_number_entry\">" | |
| print num_of_simple_functions | |
| print "</td>" | |
| print "</tr>" | |
| # Number of moderate functions | |
| print "<tr>" | |
| print "<td class=\"summary_header_entry\">" | |
| print "Number of moderate risk functions" | |
| print "</td>" | |
| print "<td class=\"summary_number_entry\">" | |
| print num_of_moderate_functions | |
| print "</td>" | |
| print "</tr>" | |
| # Number of high functions | |
| print "<tr>" | |
| print "<td class=\"summary_header_entry\">" | |
| print "Number of high risk functions" | |
| print "</td>" | |
| print "<td class=\"summary_number_entry\">" | |
| print num_of_high_functions | |
| print "</td>" | |
| print "</tr>" | |
| # Number of untestable functions | |
| print "<tr>" | |
| print "<td class=\"summary_header_entry\">" | |
| print "Number of untestable functions" | |
| print "</td>" | |
| print "<td class=\"summary_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 "<table class=\"ranges_table\">" | |
| print "<tr>" | |
| print "<td class=\"ranges_header_entry\">" | |
| print " " | |
| 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 " " | |
| 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 " " | |
| 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 " " | |
| 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 " " | |
| 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_summary_table\"" | |
| # Total number of functions | |
| print "|-" | |
| print "| class=\"cyclo_summary_header_entry\" | Total number of functions" | |
| print "| class=\"cyclo_summary_number_entry\" |" num_of_functions | |
| # Number of simple functions | |
| print "|-" | |
| print "| class=\"cyclo_summary_header_entry\" | Number of low risk functions" | |
| print "| class=\"cyclo_summary_number_entry\" |" num_of_simple_functions | |
| # Number of moderate functions | |
| print "|-" | |
| print "| class=\"cyclo_summary_header_entry\" | Number of moderate risk functions" | |
| print "| class=\"cyclo_summary_number_entry\" |" num_of_moderate_functions | |
| # Number of high functions | |
| print "|-" | |
| print "| class=\"cyclo_summary_header_entry\" | Number of high risk functions" | |
| print "| class=\"cyclo_summary_number_entry\" |" num_of_high_functions | |
| # Number of untestable functions | |
| print "|-" | |
| print "| class=\"cyclo_summary_header_entry\" | Number of untestable functions" | |
| print "| class=\"cyclo_summary_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, 1, 0, 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\">" chronos_time "</span></p>" | |
| } | |
| if (output_lang == "wiki") | |
| { | |
| print "==" package_name " Cyclomatic Complexity Report==" | |
| print "Report generated at: '''" chronos_time "'''" | |
| } | |
| 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 |