| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908 | # pmccabe2html - AWK script to convert pmccabe output to html       -*- awk -*-# Copyright (C) 2007-2012 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 & configurationBEGIN {    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 " 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;}# Functionsfunction 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)            {                sub(/\\</, "<", codeline)                sub(/\\>/, ">", codeline)                sub(/&/, "&", 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}# EpilogueEND {    # 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
 |