Commit 13e29c19 authored by Colin Watson's avatar Colin Watson

Import upstream 3.pre81.

parent 529f78d3
@rem build_w32vc.bat
@echo off
rem This file builds and tests CCCC under Microsoft Visual Studio.
rem Path to Microsoft Visual Studio standard edition release 6.0
set VCDIR=c:\Program Files\Microsoft Visual Studio\vc98
if not exist "%VCDIR%\bin\vcvars32.bat" goto no_vc
call "%VCDIR%\bin\vcvars32.bat"
if not exist pccts\bin mkdir pccts\bin
cd pccts\dlg
if exist *.obj del *.obj
nmake -f DlgMS.mak
copy dlg.exe ..\bin
cd ..\..
cd pccts\antlr
if exist *.obj del *.obj
nmake -f AntlrMS.mak
copy antlr.exe ..\bin
cd ..\..
cd cccc
if exist *.obj del *.obj
if exist *.cpp del *.cpp
nmake -f w32vc.mak
cd ..
cd test
nmake -f w32vc.mak
cd ..
goto end
:no_vc
echo This script expects MS Visual C++ to be in %VCDIR%
echo Please modify the script if the location is different.
:end
@rem build_w32vc.bat
@echo off
rem This file builds and tests CCCC under Microsoft Visual Studio.
rem Path to Microsoft Visual Studio standard edition release 6.0
set VCDIR=c:\Program Files\Microsoft Visual Studio\vc98
if not exist "%VCDIR%\bin\vcvars32.bat" goto no_vc
call "%VCDIR%\bin\vcvars32.bat"
if not exist pccts\bin mkdir pccts\bin
cd pccts\dlg
if exist *.obj del *.obj
nmake -f DlgMS.mak
copy dlg.exe ..\bin
cd ..\..
cd pccts\antlr
if exist *.obj del *.obj
nmake -f AntlrMS.mak
copy antlr.exe ..\bin
cd ..\..
cd cccc
if exist *.obj del *.obj
if exist *.cpp del *.cpp
nmake -f w32vc.mak
cd ..
cd test
nmake -f w32vc.mak
cd ..
cd vcaddin
nmake -f CcccDevStudioAddIn.mak CFG="CcccDevStudioAddIn - Win32 Release"
cd ..
goto end
:no_vc
echo This script expects MS Visual C++ to be in %VCDIR%
echo Please modify the script if the location is different.
:end
This diff is collapsed.
......@@ -620,10 +620,6 @@ instance_declaration[string& scopeName] :
>>
;
opt_qualifiers :
| /* empty */
;
class_block [string& scope]:
<<
int saved_visibility=ps->get_flag(psfVISIBILITY);
......@@ -643,14 +639,17 @@ class_block_item[string& scope] :
;
class_item_qualifier_list! :
(
FRIEND
| VIRTUAL << ps->set_flag(psfVIRTUAL,abTRUE); >>
| STATIC << ps->set_flag(psfSTATIC,abTRUE); >>
| INLINE
)*
(class_item_qualifier)? class_item_qualifier class_item_qualifier_list
| /* empty */
;
class_item_qualifier :
FRIEND
| VIRTUAL << ps->set_flag(psfVIRTUAL,abTRUE); >>
| STATIC << ps->set_flag(psfSTATIC,abTRUE); >>
| INLINE
;
access_modifier! :
access_key COLON
;
......@@ -1021,12 +1020,18 @@ inheritance_item_list[string& childName] :
inheritance_item[childName] ( COMMA inheritance_item[childName])*
;
inheritance_access_key :
VIRTUAL { access_key }
| access_key { VIRTUAL }
| /* empty */
;
inheritance_item[string& childName] :
<<
string parent_scope,parent_name;
int startLine=LT(1)->getLine();
>>
{ VIRTUAL } { access_key } { VIRTUAL } type_name[parent_name]
inheritance_access_key type_name[parent_name]
<<
int endLine=LT(1)->getLine();
ps->record_userel_extent(startLine,endLine,
......@@ -1071,14 +1076,14 @@ ctor_init_item :
;
linkage_qualifiers:
linkage_qualifier linkage_qualifiers
(linkage_qualifier)? linkage_qualifier linkage_qualifiers
| /* empty */
;
linkage_qualifier :
STATIC << ps->set_flag(psfSTATIC,abTRUE); >>
STATIC << ps->set_flag(psfSTATIC,abTRUE); >>
| ( EXTERN STRINGCONST )?
| EXTERN
| EXTERN
| INLINE
| TEMPLATE { angle_block }
;
......@@ -1200,7 +1205,7 @@ nested_token [ int nl ] : << ANTLRTokenPtr la_ptr=LT(1); >>
scoped :
( keyword )?
| op
| (op)?
| IDENTIFIER
| literal
;
......
......@@ -15,26 +15,21 @@ int ifstr_line;
extern CCCC_Project *prj;
// the file scope variable last_supplier is used to supress repeated
// output of the supplier name in the use relationship section where
// the current record has the same supplier as the previous one
// the indentation makes this reasonably clear
static string last_supplier="";
// persistence facilities
#define SEP '@'
// This function provides the ability for the persistence functions
// defined below to do a quick peek at the first token on the stream
// leaving the get pointer at the start of that token.
// This should be static, but on MSVC++ this gives me an unresolved
// symbol at link.
bool PeekAtNextLinePrefix(ifstream& ifstr, string pfx)
{
bool retval=false;
......
......@@ -116,8 +116,8 @@ void CCCC_Html_Stream::GenerateReports(CCCC_Project* prj,
<< "as part of a PhD research project. "
<< "This project is now completed and descriptions of the "
<< "findings can be accessed at "
<< "<A HREF=http://www.fste.ac.cowan.edu.au/~tlittlef>"
<< "http://www.fste.ac.cowan.edu.au/~tlittlef</A>. "
<< "<A HREF=http://www.chs.ecu.edu.au/~tlittlef>"
<< "http://www.chs.ecu.edu.au/~tlittlef</A>. "
<< "<P>User support for CCCC can be obtained by "
<< "<A HREF=mailto:cccc-users@lists.sourceforge.net>"
<< "mailing the list cccc-users@lists.sourceforge.net</A>."
......
......@@ -125,8 +125,25 @@ string CCCC_Metric::value_string() const
}
else
{
float result=numerator;
double result=numerator;
result/=denominator;
if(result!=0.0L)
{
// Visual C++ and GCC appear to give different behaviours
// when rounding a value which is exactly half way between
// two points representable in the desired format.
// An example of this occurs results from prn14, where the
// numerator 21 and denominator 16 are combined to give the
// value 1.2125 exactly, which Visual Studio renders as 1.213,
// GCC renders as 1.212. For consistency with the existing
// reference data, I choose to apply a very small downward
// rounding factor. The rounding factor is only applied if
// the value is not exactly equal to zero, as applying it
// to zero causes the value to be displayed as -0.0 instead
// of 0.0.
const double ROUNDING_FACTOR = 1.0e-9;
result-=ROUNDING_FACTOR;
}
valuestr << result;
}
valuestr << std::ends;
......
......@@ -25,6 +25,7 @@ class CCCC_Module : public CCCC_Record
{
friend class CCCC_Project;
friend class CCCC_Html_Stream;
friend class CCCC_Xml_Stream;
CCCC_Project *project;
string module_name, module_type;
......
......@@ -27,6 +27,7 @@ enum RelationshipMaskElements
class CCCC_Project : public CCCC_Record
{
friend class CCCC_Html_Stream;
friend class CCCC_Xml_Stream;
friend class CCCC_Module;
friend class CCCC_Member;
friend class CCCC_UseRelationship;
......
......@@ -20,6 +20,7 @@ enum NameLevel { nlRANK, nlSEARCH, nlSIMPLE, nlLOCAL, nlGLOBAL };
class CCCC_Record
{
friend class CCCC_Html_Stream;
friend class CCCC_Xml_Stream;
static CCCC_Project *active_project;
protected:
typedef CCCC_Table<CCCC_Extent> Extent_Table;
......
#define CCCC_VERSION "3.pre63"
#define CCCC_VERSION "3.pre81"
This diff is collapsed.
#ifndef __CCCC_XML_H
#define __CCCC_XML_H
#include "cccc.h"
#include <fstream>
#include <time.h>
#include "cccc_db.h"
#include "cccc_met.h"
// Ideally, this class would be defined to reuse common
// facilities abstracted from CCCC_Html_Stream.
// This may happen in the future, for the moment, the implementation
// has been created by cut and paste.
// We need to include cccc_htm.h because it defines the enumeration
// ReportType.
#include "cccc_htm.h"
class CCCC_Xml_Stream {
friend CCCC_Xml_Stream& operator <<(CCCC_Xml_Stream& os,
const string& stg);
friend CCCC_Xml_Stream& operator <<(CCCC_Xml_Stream& os,
const CCCC_Metric& mtc);
ofstream fstr;
static string libdir;
static string outdir;
static CCCC_Project* prjptr;
void Timestamp();
void Project_Summary();
void Procedural_Summary();
void Procedural_Detail();
void Structural_Summary();
void Structural_Detail();
void OO_Design();
void Other_Extents();
void Separate_Modules();
void Source_Listing();
void Module_Summary(CCCC_Module *module_ptr);
void Module_Detail(CCCC_Module *module_ptr);
void Procedural_Detail(CCCC_Module *module_ptr);
void Structural_Detail(CCCC_Module *module_ptr);
void Separate_Module_Link(CCCC_Module *module_ptr);
void Put_Label_Node(string nodeTag, string label, int width=0,
string ref_name="", string ref_href="",
CCCC_Record *rec_ptr=0);
void Put_Metric_Node(string nodeTag, const CCCC_Metric& metric);
void Put_Metric_Node(string nodeTag, int count, string tag);
void Put_Metric_Node(string nodeTag, int num, int denom, string tag);
void Put_Extent_URL(const CCCC_Extent& extent);
void Put_Extent_Node(const CCCC_Extent& extent, int width=0, bool withDescription=false);
void Put_Extent_List(CCCC_Record& record,bool withDescription=false);
void Put_Structural_Details_Node(CCCC_Module *mod,
CCCC_Project *prj,
int mask,
UserelNameLevel nl);
public:
static void GenerateReports(CCCC_Project* project, int report_mask,
const string& outfile, const string& outdir);
// general-purpose constructor with standard preamble
CCCC_Xml_Stream(const string& fname, const string& info);
// destructor with standard trailer
~CCCC_Xml_Stream();
};
CCCC_Xml_Stream& operator <<(CCCC_Xml_Stream& os, const string& stg);
CCCC_Xml_Stream& operator <<(CCCC_Xml_Stream& os, const CCCC_Metric& mtc);
CCCC_Xml_Stream& operator <<(CCCC_Xml_Stream& os, const CCCC_Extent& ext);
#if 0
// this class is added to support the generation of an HTML file
// containing the source analysed by the run, with anchors embedded at
// each of the lines referred to in the other parts of the report
class Source_Anchor
{
// if this looks more like a struct to you, it does to me too...
// it could be embedded withing CCCC_Xml_Stream except that this
// might make the default constructor unavailable for the std::map
// instantiation
string file_;
int line_;
public:
Source_Anchor():line_(0) {}
Source_Anchor(string file, int line) : file_(file), line_(line) {}
string get_file() const { return file_; }
int get_line() const { return line_; }
string key() const;
void Emit_HREF(ofstream& fstr);
void Emit_NAME(ofstream& fstr);
void Emit_SPACE(ofstream& fstr);
// the default copy constructor, assignment operator and destructor
// are OK for this class
};
#endif
#endif /* __CCCC_XML_H */
......@@ -25,7 +25,7 @@
#include "cccc_db.h"
#include "cccc_utl.h"
#include "cccc_htm.h"
#include "cccc_xml.h"
// support for languages is now a compile-time option
#ifdef CC_INCLUDED
......@@ -81,6 +81,7 @@ class Main
string opt_infile;
string opt_outfile;
string html_outfile;
string xml_outfile;
string lang;
int report_mask;
int debug_mask;
......@@ -107,6 +108,9 @@ public:
int DumpDatabase();
int LoadDatabase();
void GenerateHtml();
void GenerateXml();
void DescribeOutput();
friend int main(int argc, char** argv);
};
......@@ -189,6 +193,11 @@ void Main::HandleArgs(int argc, char **argv)
{
html_outfile=next_val;
}
else if(next_opt=="--xml_outfile")
{
xml_outfile=next_val;
}
else if(next_opt=="--lang")
{
lang=next_val;
......@@ -230,6 +239,10 @@ void Main::HandleArgs(int argc, char **argv)
{
html_outfile=outdir+"/cccc.html";
}
if(xml_outfile=="")
{
xml_outfile=outdir+"/cccc.xml";
}
if(opt_outfile=="")
{
opt_outfile=outdir+"/cccc.opt";
......@@ -459,15 +472,18 @@ int Main::LoadDatabase()
void Main::GenerateHtml()
{
cerr << endl << "Generating reports" << endl;
cerr << endl << "Generating HTML reports" << endl;
CCCC_Html_Stream::GenerateReports(prj,report_mask,html_outfile,outdir);
// make sure the user knows where the real output went
cerr << endl
<< "Primary HTML output is in " << html_outfile << endl
<< "Detailed reports on modules and source are in " << outdir << endl
<< "Database dump is in " << db_outfile << endl;
}
void Main::GenerateXml()
{
cerr << endl << "Generating XML reports" << endl;
CCCC_Xml_Stream::GenerateReports(prj,report_mask,xml_outfile,outdir);
}
void Main::HandleDebugOption(const string& arg)
......@@ -612,6 +628,24 @@ void Main::PrintCredits(ostream& os)
}
void Main::DescribeOutput()
{
// make sure the user knows where the real output went
// make sure the user knows where the real output went
cerr << endl
<< "Primary HTML output is in " << html_outfile << endl;
if(report_mask & rtSEPARATE_MODULES)
{
cerr << "Detailed HTML reports on modules and source are in " << outdir << endl;
}
cerr << "Primary XML output is in " << xml_outfile << endl ;
if(report_mask & rtSEPARATE_MODULES)
{
cerr << "Detailed XML reports on modules are in " << outdir << endl;
}
cerr << "Database dump is in " << db_outfile << endl << endl;
}
/*
** the usage message is printed on cerr if unexpected options are found,
** and on cout if option --help is found.
......@@ -624,35 +658,24 @@ void Main::PrintUsage(ostream& os)
"cccc [options] file1.c ... ",
"Process files listed on command line.",
"If the filenames include '-', read a list of files from standard input.",
"",
"This program is work in progress and is not well documented.",
"Please be prepared to refer to the source code for the ",
"meaning of some options.",
"",
"Options:",
"Command Line Options: (default arguments/behaviour specified in braces)",
"--help * generate this help message",
"--outdir=<dname> * directory for generated files",
" (default=.cccc)",
"--html_outfile=<fname> * name of primary HTML report generated ",
" (default=<outdir>/cccc.html)",
"--outdir=<dname> * directory for generated files {.cccc}",
"--html_outfile=<fname> * name of main HTML report {<outdir>/cccc.html}",
"--xml_outfile=<fname> * name of main XML report {<outdir>/cccc.xml}",
"--db_infile=<fname> * preload internal database from named file",
" (default=no initial content)",
"--db_outfile=<fname> * save internal database to named file",
" (default=<outdir>/cccc.db)",
"--opt_infile=<fname> * load options from named file",
" (default=use compiled-in option values, ",
" refer to cccc_opt.cc for option information)",
"--opt_outfile=<fname> * save options to named file",
" (default=<outdir>/cccc.opt)",
" {empty file}",
"--db_outfile=<fname> * save internal database to file {<outdir>/cccc.db}",
"--opt_infile=<fname> * load options from named file {hard coded, see below}",
"--opt_outfile=<fname> * save options to named file {<outdir>/cccc.opt}",
"--lang=<string> * use language specified for files specified ",
" after this option ",
" languages supported are c,c++,ada,java",
" (default=use language/extension mapping ",
" controlled by options)",
" after this option (c,c++,ada,java, no default)",
"--report_mask=<hex> * control report content ",
" (refer to ccccmain.cc for mask values) ",
"--debug_mask=<hex> * control debug output content ",
" (refer to ccccmain.cc for mask values)",
"Refer to ccccmain.cc for usage of --report_mask and --debug_mask.",
"Refer to cccc_opt.cc for hard coded default option values, including default ",
"extension/language mapping and metric treatment thresholds.",
NULL
};
const char **string_ptr=usage_strings;
......@@ -689,6 +712,8 @@ int main(int argc, char **argv)
// generate html output
app->GenerateHtml();
app->GenerateXml();
app->DescribeOutput();
delete app;
delete prj;
......
This diff is collapsed.
......@@ -2,8 +2,16 @@
## GNUMakefile to build the CCCC project on the POSIX compliant
## platforms using the GNU C Compiler.
## Tested with:
## GCC 2.95.3 on Mandrake Linux v7.2 (reported by Tim Littlefair)
## EGCS 2.91.66 (aka kgcc) on Mandrake Linux v7.2 (reported by Tim Littlefair)
## GCC 2.96 on Red Hat 7.2 (reported by Tim Littlefair)
## GCC 3.2 on Mandrake Linux 9.0 (reported by Tim Littlefair)
## The '-static' link argument was removed as a result of problems
## encountered on GCC 3.2 - as we don't prebuild binaries at present
## dynamic linking shouldn't be a killer problem.
## (More reports welcome)
## See rules.mak for discussion of the meaning of the make variables
## which this file defines
......@@ -20,7 +28,7 @@ CCC=g++
LD=g++
CFLAGS=-c -I../pccts/h $(CFLAGS_DEBUG) -x c++
C_OFLAG=-o
LDFLAGS=$(LDFLAGS_DEBUG) -static
LDFLAGS=$(LDFLAGS_DEBUG)
LD_OFLAG=-o
OBJEXT=o
CCCC_EXE=cccc
......
......@@ -81,8 +81,8 @@ USR_G = cccc.g java.g ada.g
USR_C = ccccmain.cc cccc_tok.cc cccc_met.cc cccc_utl.cc \
cccc_db.cc cccc_rec.cc cccc_ext.cc cccc_prj.cc cccc_mod.cc \
cccc_mem.cc cccc_use.cc cccc_htm.cc cccc_tbl.cc cccc_tpl.cc \
cccc_new.cc cccc_itm.cc cccc_opt.cc
cccc_mem.cc cccc_use.cc cccc_htm.cc cccc_xml.cc cccc_tbl.cc \
cccc_tpl.cc cccc_new.cc cccc_itm.cc cccc_opt.cc
USR_H = cccc.h cccc_tok.h cccc_met.h cccc_utl.h \
cccc_db.h cccc_htm.h cccc_tbl.h cccc_itm.h \
......@@ -121,7 +121,7 @@ USR_OBJ = \
ccccmain.$(OBJEXT) cccc_utl.$(OBJEXT) cccc_opt.$(OBJEXT) \
cccc_db.$(OBJEXT) cccc_rec.$(OBJEXT) cccc_ext.$(OBJEXT) \
cccc_prj.$(OBJEXT) cccc_mod.$(OBJEXT) cccc_mem.$(OBJEXT) \
cccc_use.$(OBJEXT) cccc_met.$(OBJEXT) cccc_htm.$(OBJEXT) \
cccc_use.$(OBJEXT) cccc_met.$(OBJEXT) cccc_htm.$(OBJEXT) cccc_xml.$(OBJEXT) \
cccc_tok.$(OBJEXT) cccc_tbl.$(OBJEXT) \
cccc_tpl.$(OBJEXT) cccc_new.$(OBJEXT) cccc_itm.$(OBJEXT) \
......
......@@ -62,4 +62,11 @@ the Sun Java tutorial now parse without (mentioning) errors.
Modified the support URLs in various places to point to the email address
of the SourceForge cccc-users list rather than my own email address.
version 3.pre81
Fixed the diff.bat script to reflect the true outcome of the comparison.
Made cccc_met.cc round down to eliminate a difference in the output
on prn14.
Added XML format output.
Fixed command line environment for Windows XP.
Modified URLs to research project to reflect new naming at ecu.edu.au.
......@@ -114,7 +114,7 @@ my PhD. I am still getting a steady stream of enquiries about CCCC,
and I am keen to put out a high quality reference version of the software
as a way of thanking the people who have assisted me by participating in
the various stages of my research. The research project is described at
http://www-chs.ecu.edu.au/~tlittlef. This page includes a link to a
http://www.chs.ecu.edu.au/~tlittlef. This page includes a link to a
downloadable PDF version of the PhD thesis.
I am grateful to a number of people for assistance on this project, including
......@@ -128,7 +128,7 @@ into maintaining it over the coming months and years.
Tim Littlefair (tim_littlefair@hotmail.com)
updated November 2001
updated August 2003
--------------
This and future distributions of CCCC and related tools should be
......
......@@ -7,13 +7,13 @@ rem value, so the tester must visually check the output
rem to ensure that the test did pass, even though NMAKE thought
rem it did.
if "%2" == "" goto usage
if not "%2" == "" goto AfterUsage
:usage
echo DIFF [file1] [file2]
goto :end
:afterUsage
fc %1 %2
:end
goto end
:usage
DIFF [file1] [file2]
:end
......@@ -259,5 +259,5 @@ ssim_func_port_handle</A>
<H1><A NAME="infocccc">About CCCC</A></H1>
<P>This report was generated by the program CCCC, which is FREELY REDISTRIBUTABLE but carries NO WARRANTY.
<P>CCCC was developed by Tim Littlefair.
as part of a PhD research project. This project is now completed and descriptions of the findings can be accessed at <A HREF=http://www.fste.ac.cowan.edu.au/~tlittlef>http://www.fste.ac.cowan.edu.au/~tlittlef</A>. <P>User support for CCCC can be obtained by <A HREF=mailto:cccc-users@lists.sourceforge.net>mailing the list cccc-users@lists.sourceforge.net</A>.<P>Please also visit the CCCC development website at <A HREF=http://cccc.sourceforge.net>http://cccc.sourceforge.net</A>.
as part of a PhD research project. This project is now completed and descriptions of the findings can be accessed at <A HREF=http://www.chs.ecu.edu.au/~tlittlef>http://www.chs.ecu.edu.au/~tlittlef</A>. <P>User support for CCCC can be obtained by <A HREF=mailto:cccc-users@lists.sourceforge.net>mailing the list cccc-users@lists.sourceforge.net</A>.<P>Please also visit the CCCC development website at <A HREF=http://cccc.sourceforge.net>http://cccc.sourceforge.net</A>.
</BODY></HTML>
<?xml version="1.0" encoding="utf-8"?>
<!--Report on software metrics-->
<CCCC_Project>
<project_summary>
<number_of_modules value="3" level="0" />
<lines_of_code value="5" level="0" />
<lines_of_code_per_module value="1.667" level="0" />
<McCabes_cyclomatic_complexity value="2" level="0" />
<McCabes_cyclomatic_complexity_per_module value="0.667" level="0" />
<lines_of_comment value="1" level="0" />
<lines_of_comment_per_module value="0.333" level="0" />
<lines_of_code_per_line_of_comment value="------" level="0" />
<McCabes_cyclomatic_complexity_per_line_of_comment value="------" level="0" />
<IF4 value="0" level="0" />
<IF4_per_module value="0.000" level="0" />
<IF4_visible value="0" level="0" />
<IF4_visible_per_module value="0.000" level="0" />
<IF4_concrete value="0" level="0" />
<IF4_concrete value="0.000" level="0" />
<rejected_lines_of_code value="0" level="0" />
</project_summary>
<procedural_summary>
<module>
<name>STATIC</name>
<lines_of_code value="0" level="0" />
<McCabes_cyclomatic_complexity value="0" level="0" />
<lines_of_comment value="0" level="0" />
<lines_of_code_per_line_of_comment value="------" level="0" />
<McCabes_cyclomatic_complexity_per_line_of_comment value="------" level="0" />
</module>
<module>
<name>anonymous</name>
<lines_of_code value="5" level="0" />
<McCabes_cyclomatic_complexity value="2" level="0" />
<lines_of_comment value="1" level="0" />
<lines_of_code_per_line_of_comment value="------" level="0" />
<McCabes_cyclomatic_complexity_per_line_of_comment value="------" level="0" />
</module>
<module>
<name>ssim_func_port_handle</name>
<lines_of_code value="0" level="0" />
<McCabes_cyclomatic_complexity value="0" level="0" />
<lines_of_comment value="0" level="0" />
<lines_of_code_per_line_of_comment value="------" level="0" />
<McCabes_cyclomatic_complexity_per_line_of_comment value="------" level="0" />
</module>
</procedural_summary>
<procedural_detail>
<module>
<name>STATIC</name>
</module>
<module>
<name>anonymous</name>
<member_function>
<name>yadda(STATIC *,ssim_func_port_handle)</name>
<extent>
<description>definition</description>
<source_reference file="prn1.cc" line="1" />
</extent>
<lines_of_code value="5" level="0" />
<McCabes_cyclomatic_complexity value="2" level="0" />
<lines_of_comment value="1" level="0" />
<lines_of_code_per_line_of_comment value="------" level="0" />
<McCabes_cyclomatic_complexity_per_line_of_comment value="------" level="0" />
</member_function>
</module>
<module>
<name>ssim_func_port_handle</name>
</module>
</procedural_detail>
<oo_design>
<module>
<name>STATIC</name>
<weighted_methods_per_class_unity value="0" level="0" />
<weighted_methods_per_class_visibility value="0" level="0" />
<depth_of_inheritance_tree value="0" level="0" />
<number_of_children value="0" level="0" />
<coupling_between_objects value="0" level="0" />
</module>
<module>
<name>anonymous</name>
<weighted_methods_per_class_unity value="1" level="0" />
<weighted_methods_per_class_visibility value="0" level="0" />
<depth_of_inheritance_tree value="0" level="0" />
<number_of_children value="0" level="0" />
<coupling_between_objects value="0" level="0" />
</module>
<module>
<name>ssim_func_port_handle</name>
<weighted_methods_per_class_unity value="0" level="0" />