.
# 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 {
    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 = "Back to " package_name " Homepage "
    if (caption != "")
    {
        print "" 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 "
"
}
function html_header ()
{
    print html_doctype
    print ""
    print html_comment
    print ""
    print "" html_title " "
    print ""
    print ""
    if (fname_p)
    {
        print ""
        if (file_p && mcyclo[nfun] > cyclo_simple_max)
        {
            print "\
↓  "
        }
        else
        {
            print " "
        }
        print " "
        print ""
        print fname
        print " "
    }
    if (mcyclo_p)
    {
        # Modified cyclo
        print ""
        print mcyclo[nfun]
        print " "
    }
    if (cyclo_p)
    {
        # Cyclo
        print ""
        print cyclo[nfun]
        print " "
    }
    if (num_statements_p)
    {
        # Number of statements
        print ""
        print num_statements[nfun]
        print " "
    }
    if (num_lines_p)
    {
        # Number of lines
        print ""
        print num_lines[nfun]
        print " "
    }
    if (first_line_p)
    {
        # First line
        print ""
        print first_line[nfun]
        print " "
    }
    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 ""
        if (href != "")
        {
            print "" file[nfun] " "
        }
        else
        {
            print file[nfun]
        }
        print " "
        print " "
        if (mcyclo[nfun] > cyclo_simple_max)
        {
            print ""
            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 ""
            print ""
            print "
"
            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 " "
            print "
 "
            print " "
        }
    }
}
function html_global_stats ()
{
    print "Summary
"
    print ""
    # Total number of functions
    print ""
    print ""
    print ""
    print num_of_functions
    print " "
    print " "
    # Number of simple functions
    print ""
    print ""
    print ""
    print num_of_simple_functions
    print " "
    print " "
    # Number of moderate functions
    print ""
    print ""
    print ""
    print num_of_moderate_functions
    print " "
    print " "
    # Number of high functions
    print ""
    print ""
    print ""
    print num_of_high_functions
    print " "
    print " "
    # Number of untestable functions
    print ""
    print ""
    print ""
    print num_of_untestable_functions
    print " "
    print " "
    print "
"
    print "Details for all functions
"
    print ""
    print ""
    print ""
    print ""
    print ""
    print " "
    # Simple
    print ""
    print ""
    print " "
    print " "
    print ""
    print "0 - " cyclo_simple_max
    print " "
    print ""
    print "Simple module, without much risk"
    print " "
    print " "
    # Moderate
    print ""
    print ""
    print " "
    print " "
    print ""
    print cyclo_simple_max + 1 " - " cyclo_moderate_max
    print " "
    print ""
    print "More complex module, moderate risk"
    print " "
    print " "
    # High
    print ""
    print ""
    print " "
    print " "
    print ""
    print cyclo_moderate_max + 1 " - " cyclo_high_max
    print " "
    print ""
    print "Complex module, high risk"
    print " "
    print " "
    # Untestable
    print ""
    print ""
    print " "
    print " "
    print ""
    print "greater than " cyclo_high_max
    print " "
    print ""
    print "Untestable module, very high risk"
    print " "
    print " "
    print "
"
    print "" package_name " Cyclomatic Complexity Report
"
        print "Report generated at: " strftime() " 
"
    }
    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