[PATCH v1] Reports: Convert to C++
Chris Johns
chrisj at rtems.org
Tue Jul 13 23:59:59 UTC 2021
Hi Ryan,
Looks great and thank you for making the changes. I have a minor nit below and
with that change the patch to OK to push. There is no need for a fruther review.
Thanks
Chris
On 12/7/21 11:42 pm, Ryan Long wrote:
> ---
> tester/covoar/ReportsBase.cc | 296 ++++++------
> tester/covoar/ReportsBase.h | 118 +++--
> tester/covoar/ReportsHtml.cc | 1074 +++++++++++++++++-------------------------
> tester/covoar/ReportsHtml.h | 94 ++--
> tester/covoar/ReportsText.cc | 261 +++++-----
> tester/covoar/ReportsText.h | 34 +-
> 6 files changed, 838 insertions(+), 1039 deletions(-)
>
> diff --git a/tester/covoar/ReportsBase.cc b/tester/covoar/ReportsBase.cc
> index 328980d..7fd3422 100644
> --- a/tester/covoar/ReportsBase.cc
> +++ b/tester/covoar/ReportsBase.cc
> @@ -4,6 +4,9 @@
> #include <sys/stat.h>
> #include <sys/types.h>
>
> +#include <iomanip>
> +#include <sstream>
> +
> #include "ReportsBase.h"
> #include "app_common.h"
> #include "CoverageRanges.h"
> @@ -20,7 +23,7 @@
>
> namespace Coverage {
>
> -ReportsBase::ReportsBase( time_t timestamp, std::string symbolSetName ):
> +ReportsBase::ReportsBase( time_t timestamp, const std::string& symbolSetName ):
> reportExtension_m(""),
> symbolSetName_m(symbolSetName),
> timestamp_m( timestamp )
> @@ -31,13 +34,13 @@ ReportsBase::~ReportsBase()
> {
> }
>
> -FILE* ReportsBase::OpenFile(
> - const char* const fileName,
> - const char* const symbolSetName
> +void ReportsBase::OpenFile(
> + const std::string& fileName,
> + const std::string& symbolSetName,
> + std::ofstream& aFile
> )
> {
> int sc;
> - FILE *aFile;
> std::string file;
>
> std::string symbolSetOutputDirectory;
> @@ -54,120 +57,131 @@ FILE* ReportsBase::OpenFile(
> sc = mkdir( symbolSetOutputDirectory.c_str(),0755 );
> #endif
> if ( (sc == -1) && (errno != EEXIST) ) {
> - fprintf(
> - stderr,
> - "Unable to create output directory %s\n",
> - symbolSetOutputDirectory.c_str()
> + throw rld::error(
> + "Unable to create output directory",
> + "ReportsBase::OpenFile"
> );
> - return NULL;
> + return;
> }
>
> file = symbolSetOutputDirectory;
> rld::path::path_join(file, fileName, file);
>
> // Open the file.
> - aFile = fopen( file.c_str(), "w" );
> - if ( !aFile ) {
> - fprintf( stderr, "Unable to open %s\n", file.c_str() );
> + aFile.open( file );
> + if ( !aFile.is_open() ) {
> + std::cerr << "Unable to open " << file << std::endl;
> }
> - return aFile;
> + return;
Not needed.
> }
>
> void ReportsBase::WriteIndex(
> - const char* const fileName
> + const std::string& fileName
> )
> {
> }
>
> -FILE* ReportsBase::OpenAnnotatedFile(
> - const char* const fileName
> +void ReportsBase::OpenAnnotatedFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - return OpenFile(fileName, symbolSetName_m.c_str());
> + OpenFile(fileName, symbolSetName_m, aFile);
> + return;
Same.
> }
>
> -FILE* ReportsBase::OpenBranchFile(
> - const char* const fileName,
> - bool hasBranches
> +void ReportsBase::OpenBranchFile(
> + const std::string& fileName,
> + bool hasBranches,
> + std::ofstream& aFile
> )
> {
> - return OpenFile(fileName, symbolSetName_m.c_str());
> + OpenFile(fileName, symbolSetName_m, aFile);
> + return;
> }
>
> -FILE* ReportsBase::OpenCoverageFile(
> - const char* const fileName
> +void ReportsBase::OpenCoverageFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - return OpenFile(fileName, symbolSetName_m.c_str());
> + OpenFile(fileName, symbolSetName_m, aFile);
> + return;
same
> }
>
> -FILE* ReportsBase::OpenNoRangeFile(
> - const char* const fileName
> +void ReportsBase::OpenNoRangeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - return OpenFile(fileName, symbolSetName_m.c_str());
> + OpenFile(fileName, symbolSetName_m, aFile);
> + return;
etc
> }
>
>
> -FILE* ReportsBase::OpenSizeFile(
> - const char* const fileName
> +void ReportsBase::OpenSizeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - return OpenFile(fileName, symbolSetName_m.c_str());
> + OpenFile(fileName, symbolSetName_m, aFile);
> + return;
> }
>
> -FILE* ReportsBase::OpenSymbolSummaryFile(
> - const char* const fileName
> +void ReportsBase::OpenSymbolSummaryFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - return OpenFile(fileName, symbolSetName_m.c_str());
> + OpenFile(fileName, symbolSetName_m, aFile);
> + return;
> }
>
> void ReportsBase::CloseFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> - fclose( aFile );
> + aFile.close();
> }
>
> void ReportsBase::CloseAnnotatedFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> CloseFile( aFile );
> }
>
> void ReportsBase::CloseBranchFile(
> - FILE* aFile,
> - bool hasBranches
> + std::ofstream& aFile,
> + bool hasBranches
> )
> {
> CloseFile( aFile );
> }
>
> void ReportsBase::CloseCoverageFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> CloseFile( aFile );
> }
>
> void ReportsBase::CloseNoRangeFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> CloseFile( aFile );
> }
>
> void ReportsBase::CloseSizeFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> CloseFile( aFile );
> }
>
> void ReportsBase::CloseSymbolSummaryFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> CloseFile( aFile );
> @@ -195,18 +209,23 @@ std::string expand_tabs(const std::string& in) {
> * Write annotated report
> */
> void ReportsBase::WriteAnnotatedReport(
> - const char* const fileName
> + const std::string& fileName
> ) {
> - FILE* aFile = NULL;
> + std::ofstream aFile;
> Coverage::CoverageRanges* theBranches;
> Coverage::CoverageRanges* theRanges;
> Coverage::CoverageMapBase* theCoverageMap = NULL;
> uint32_t bAddress = 0;
> AnnotatedLineState_t state;
>
> - aFile = OpenAnnotatedFile(fileName);
> - if (!aFile)
> + OpenAnnotatedFile(fileName, aFile);
> + if (!aFile.is_open()) {
> + throw rld::error(
> + "Unable to open " + fileName,
> + "ReportsBase::WriteAnnotatedReport"
> + );
> return;
> + }
>
> // Process uncovered branches for each symbol.
> const std::vector<std::string>& symbols = SymbolsToAnalyze->getSymbolsForSet(symbolSetName_m);
> @@ -238,7 +257,8 @@ void ReportsBase::WriteAnnotatedReport(
> std::string annotation = "";
> std::string line;
> const std::size_t LINE_LENGTH = 150;
> - char textLine[LINE_LENGTH];
> + std::string textLine = "";
> + std::stringstream ss;
>
> state = A_SOURCE;
>
> @@ -264,7 +284,12 @@ void ReportsBase::WriteAnnotatedReport(
> }
>
> std::string textLineWithoutTabs = expand_tabs(instruction.line);
> - snprintf( textLine, LINE_LENGTH, "%-90s", textLineWithoutTabs.c_str() );
> +
> + ss << std::left << std::setw( 90 )
> + << textLineWithoutTabs.c_str();
> +
> + textLine = ss.str().substr( 0, LINE_LENGTH );
> +
> line = textLine + annotation;
>
> PutAnnotatedLine( aFile, state, line, id);
> @@ -280,9 +305,9 @@ void ReportsBase::WriteAnnotatedReport(
> * Write branch report
> */
> void ReportsBase::WriteBranchReport(
> - const char* const fileName
> + const std::string& fileName
> ) {
> - FILE* report = NULL;
> + std::ofstream report;
> Coverage::CoverageRanges* theBranches;
> unsigned int count;
> bool hasBranches = true;
> @@ -292,8 +317,8 @@ void ReportsBase::WriteBranchReport(
> hasBranches = false;
>
> // Open the branch report file
> - report = OpenBranchFile( fileName, hasBranches );
> - if (!report)
> + OpenBranchFile( fileName, hasBranches, report );
> + if (!report.is_open())
> return;
>
> // If no branches were found then branch coverage is not supported
> @@ -324,26 +349,26 @@ void ReportsBase::WriteBranchReport(
> * Write coverage report
> */
> void ReportsBase::WriteCoverageReport(
> - const char* const fileName
> + const std::string& fileName
> )
> {
> - FILE* report;
> + std::ofstream report;
> Coverage::CoverageRanges* theRanges;
> unsigned int count;
> - FILE* NoRangeFile;
> + std::ofstream NoRangeFile;
> std::string NoRangeName;
>
> // Open special file that captures NoRange informaiton
> NoRangeName = "no_range_";
> NoRangeName += fileName;
> - NoRangeFile = OpenNoRangeFile ( NoRangeName.c_str() );
> - if (!NoRangeFile) {
> + OpenNoRangeFile( NoRangeName, NoRangeFile );
> + if ( !NoRangeFile.is_open() ) {
> return;
> }
>
> // Open the coverage report file.
> - report = OpenCoverageFile( fileName );
> - if ( !report ) {
> + OpenCoverageFile( fileName, report );
> + if ( !report.is_open() ) {
> return;
> }
>
> @@ -380,16 +405,16 @@ void ReportsBase::WriteCoverageReport(
> * Write size report
> */
> void ReportsBase::WriteSizeReport(
> - const char* const fileName
> + const std::string& fileName
> )
> {
> - FILE* report;
> + std::ofstream report;
> Coverage::CoverageRanges* theRanges;
> unsigned int count;
>
> // Open the report file.
> - report = OpenSizeFile( fileName );
> - if ( !report ) {
> + OpenSizeFile( fileName, report );
> + if ( !report.is_open() ) {
> return;
> }
>
> @@ -414,15 +439,15 @@ void ReportsBase::WriteSizeReport(
> }
>
> void ReportsBase::WriteSymbolSummaryReport(
> - const char* const fileName
> + const std::string& fileName
> )
> {
> - FILE* report;
> + std::ofstream report;
> unsigned int count;
>
> // Open the report file.
> - report = OpenSymbolSummaryFile( fileName );
> - if ( !report ) {
> + OpenSymbolSummaryFile( fileName , report );
> + if ( !report.is_open() ) {
> return;
> }
>
> @@ -441,8 +466,8 @@ void ReportsBase::WriteSymbolSummaryReport(
> }
>
> void ReportsBase::WriteSummaryReport(
> - const char* const fileName,
> - const char* const symbolSetName
> + const std::string& fileName,
> + const std::string& symbolSetName
> )
> {
> // Calculate coverage statistics and output results.
> @@ -453,11 +478,11 @@ void ReportsBase::WriteSummaryReport(
> double percentageBranches;
> Coverage::CoverageMapBase* theCoverageMap;
> uint32_t totalBytes = 0;
> - FILE* report;
> + std::ofstream report;
>
> // Open the report file.
> - report = OpenFile( fileName, symbolSetName );
> - if ( !report ) {
> + OpenFile( fileName, symbolSetName, report );
> + if ( !report.is_open() ) {
> return;
> }
>
> @@ -497,64 +522,45 @@ void ReportsBase::WriteSummaryReport(
> (double) SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) * 2;
> percentageBranches *= 100.0;
>
> - fprintf( report, "Bytes Analyzed : %d\n", totalBytes );
> - fprintf( report, "Bytes Not Executed : %d\n", notExecuted );
> - fprintf( report, "Percentage Executed : %5.4g\n", 100.0 - percentage );
> - fprintf( report, "Percentage Not Executed : %5.4g\n", percentage );
> - fprintf(
> - report,
> - "Unreferenced Symbols : %d\n",
> - SymbolsToAnalyze->getNumberUnreferencedSymbols(symbolSetName)
> - );
> - fprintf(
> - report,
> - "Uncovered ranges found : %d\n\n",
> - SymbolsToAnalyze->getNumberUncoveredRanges(symbolSetName)
> - );
> + report << "Bytes Analyzed : " << totalBytes << std::endl
> + << "Bytes Not Executed : " << notExecuted << std::endl
> + << "Percentage Executed : "
> + << std::fixed << std::setprecision( 2 ) << std::setw( 5 )
> + << 100.0 - percentage << std::endl
> + << "Percentage Not Executed : " << percentage << std::endl
> + << "Unreferenced Symbols : "
> + << SymbolsToAnalyze->getNumberUnreferencedSymbols( symbolSetName )
> + << std::endl << "Uncovered ranges found : "
> + << SymbolsToAnalyze->getNumberUncoveredRanges( symbolSetName )
> + << std::endl << std::endl;
> +
> if ((SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) == 0) ||
> (BranchInfoAvailable == false) ) {
> - fprintf( report, "No branch information available\n" );
> + report << "No branch information available" << std::endl;
> } else {
> - fprintf(
> - report,
> - "Total conditional branches found : %d\n",
> - SymbolsToAnalyze->getNumberBranchesFound(symbolSetName)
> - );
> - fprintf(
> - report,
> - "Total branch paths found : %d\n",
> - SymbolsToAnalyze->getNumberBranchesFound(symbolSetName) * 2
> - );
> - fprintf(
> - report,
> - "Uncovered branch paths found : %d\n",
> - SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName) +
> - SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName) +
> - (SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2)
> - );
> - fprintf(
> - report,
> - " %d branches always taken\n",
> - SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName)
> - );
> - fprintf(
> - report,
> - " %d branches never taken\n",
> - SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName)
> - );
> - fprintf(
> - report,
> - " %d branch paths not executed\n",
> - SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2
> - );
> - fprintf(
> - report,
> - "Percentage branch paths covered : %4.4g\n",
> - 100.0 - percentageBranches
> - );
> +
> + report << "Total conditional branches found : "
> + << SymbolsToAnalyze->getNumberBranchesFound( symbolSetName )
> + << std::endl << "Total branch paths found : "
> + << SymbolsToAnalyze->getNumberBranchesFound( symbolSetName ) * 2
> + << std::endl << "Uncovered branch paths found : "
> + << SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName) +
> + SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName) +
> + (SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2)
> + << std::endl << " "
> + << SymbolsToAnalyze->getNumberBranchesAlwaysTaken(symbolSetName)
> + << " branches always taken" << std::endl << " "
> + << SymbolsToAnalyze->getNumberBranchesNeverTaken(symbolSetName)
> + << " branches never taken" << std::endl << " "
> + << SymbolsToAnalyze->getNumberBranchesNotExecuted(symbolSetName) * 2
> + << " branch paths not executed" << std::endl
> + << "Percentage branch paths covered : "
> + << std::fixed << std::setprecision(2) << std::setw(4)
> + << 100.0 - percentageBranches << std::endl;
> +
> }
>
> - fclose( report );
> + CloseFile( report );
> }
>
> void GenerateReports(const std::string& symbolSetName)
> @@ -580,45 +586,33 @@ void GenerateReports(const std::string& symbolSetName)
>
> reportName = "index" + reports->ReportExtension();
> if (Verbose)
> - fprintf(
> - stderr, "Generate %s\n", reportName.c_str()
> - );
> - reports->WriteIndex( reportName.c_str() );
> + std::cerr << "Generate " << reportName << std::endl;
> + reports->WriteIndex( reportName );
>
> reportName = "annotated" + reports->ReportExtension();
> if (Verbose)
> - fprintf(
> - stderr, "Generate %s\n", reportName.c_str()
> - );
> - reports->WriteAnnotatedReport( reportName.c_str() );
> + std::cerr << "Generate " << reportName << std::endl;
> + reports->WriteAnnotatedReport( reportName );
>
> reportName = "branch" + reports->ReportExtension();
> if (Verbose)
> - fprintf(
> - stderr, "Generate %s\n", reportName.c_str()
> - );
> - reports->WriteBranchReport(reportName.c_str() );
> + std::cerr << "Generate " << reportName << std::endl;
> + reports->WriteBranchReport( reportName );
>
> reportName = "uncovered" + reports->ReportExtension();
> if (Verbose)
> - fprintf(
> - stderr, "Generate %s\n", reportName.c_str()
> - );
> - reports->WriteCoverageReport(reportName.c_str() );
> + std::cerr << "Generate " << reportName << std::endl;
> + reports->WriteCoverageReport( reportName );
>
> reportName = "sizes" + reports->ReportExtension();
> if (Verbose)
> - fprintf(
> - stderr, "Generate %s\n", reportName.c_str()
> - );
> - reports->WriteSizeReport(reportName.c_str() );
> + std::cerr << "Generate " << reportName << std::endl;
> + reports->WriteSizeReport( reportName );
>
> reportName = "symbolSummary" + reports->ReportExtension();
> if (Verbose)
> - fprintf(
> - stderr, "Generate %s\n", reportName.c_str()
> - );
> - reports->WriteSymbolSummaryReport(reportName.c_str() );
> + std::cerr << "Generate " << reportName << std::endl;
> + reports->WriteSymbolSummaryReport( reportName );
> }
>
> for (ritr = reportList.begin(); ritr != reportList.end(); ritr++ ) {
> @@ -626,7 +620,7 @@ void GenerateReports(const std::string& symbolSetName)
> delete reports;
> }
>
> - ReportsBase::WriteSummaryReport( "summary.txt", symbolSetName.c_str() );
> + ReportsBase::WriteSummaryReport( "summary.txt", symbolSetName );
> }
>
> }
> diff --git a/tester/covoar/ReportsBase.h b/tester/covoar/ReportsBase.h
> index ab8f8dd..ed381fb 100644
> --- a/tester/covoar/ReportsBase.h
> +++ b/tester/covoar/ReportsBase.h
> @@ -11,6 +11,8 @@
>
> #include <stdint.h>
> #include <string>
> +#include <iostream>
> +#include <fstream>
> #include <time.h>
> #include "DesiredSymbols.h"
>
> @@ -24,7 +26,7 @@ namespace Coverage {
> class ReportsBase {
>
> public:
> - ReportsBase( time_t timestamp, std::string symbolSetName );
> + ReportsBase( time_t timestamp, const std::string& symbolSetName );
> virtual ~ReportsBase();
>
> /*!
> @@ -33,7 +35,7 @@ class ReportsBase {
> * @param[in] fileName identifies the report file name
> */
> virtual void WriteIndex(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -43,7 +45,7 @@ class ReportsBase {
> * @param[in] fileName identifies the annotated report file name
> */
> void WriteAnnotatedReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -53,7 +55,7 @@ class ReportsBase {
> * @param[in] fileName identifies the branch report file name
> */
> void WriteBranchReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -63,7 +65,7 @@ class ReportsBase {
> * @param[in] fileName identifies the coverage report file name
> */
> void WriteCoverageReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -73,7 +75,7 @@ class ReportsBase {
> * @param[in] fileName identifies the report file name
> */
> void WriteSizeReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -83,15 +85,15 @@ class ReportsBase {
> * @param[in] fileName identifies the report file name
> */
> void WriteSymbolSummaryReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> * This method produces a sumary report for the overall test run.
> */
> static void WriteSummaryReport(
> - const char* const fileName,
> - const char* const symbolSetName
> + const std::string& fileName,
> + const std::string& symbolSetName
> );
>
> /*!
> @@ -135,10 +137,12 @@ class ReportsBase {
> *
> * @param[in] fileName identifies the report file name
> * @param[in] symbolSetName identifies the name of the report's symbol set
> + * @param[in] aFile identifies the file to open
> */
> - static FILE* OpenFile(
> - const char* const fileName,
> - const char* const symbolSetName
> + static void OpenFile(
> + const std::string& fileName,
> + const std::string& symbolSetName,
> + std::ofstream& aFile
> );
>
> /*!
> @@ -146,9 +150,11 @@ class ReportsBase {
> * Then appedns any necessary header information onto the file.
> *
> * @param[in] fileName identifies the report file name
> + * @param[in] aFile identifies the file to open
> */
> - virtual FILE* OpenAnnotatedFile(
> - const char* const fileName
> + virtual void OpenAnnotatedFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /*!
> @@ -157,10 +163,12 @@ class ReportsBase {
> *
> * @param[in] fileName identifies the report file name
> * @param[in] hasBranches indicates if there are branches to report
> + * @param[in] aFile identifies the file to open
> */
> - virtual FILE* OpenBranchFile(
> - const char* const fileName,
> - bool hasBranches
> + virtual void OpenBranchFile(
> + const std::string& fileName,
> + bool hasBranches,
> + std::ofstream& aFile
> );
>
> /*!
> @@ -168,9 +176,11 @@ class ReportsBase {
> * Then appedns any necessary header information onto the file.
> *
> * @param[in] fileName identifies the report file name
> + * @param[in] aFile identifies the file to open
> */
> - virtual FILE* OpenCoverageFile(
> - const char* const fileName
> + virtual void OpenCoverageFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /*!
> @@ -178,9 +188,11 @@ class ReportsBase {
> * Then appends any necessary header information onto the file.
> *
> * @param[in] fileName identifies the report file name
> + * @param[in] aFile identifies the file to open
> */
> - virtual FILE* OpenNoRangeFile(
> - const char* const fileName
> + virtual void OpenNoRangeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /*!
> @@ -188,9 +200,11 @@ class ReportsBase {
> * Then appedns any necessary header information onto the file.
> *
> * @param[in] fileName identifies the report file name
> + * @param[in] aFile identifies the file to open
> */
> - virtual FILE* OpenSizeFile(
> - const char* const fileName
> + virtual void OpenSizeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /*!
> @@ -198,39 +212,41 @@ class ReportsBase {
> * Then appedns any necessary header information onto the file.
> *
> * @param[in] fileName identifies the report file name
> + * @param[in] aFile identifies the file to open
> */
> - virtual FILE* OpenSymbolSummaryFile(
> - const char* const fileName
> + virtual void OpenSymbolSummaryFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /*!
> * This method Closes a report file.
> *
> - * @param[in] aFile identifies the report file name
> + * @param[in] aFile identifies the file to close
> */
> static void CloseFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /*!
> * This method puts any necessary footer information into
> * the report then closes the file.
> *
> - * @param[in] aFile identifies the report file name
> + * @param[in] aFile identifies the file to close
> */
> virtual void CloseAnnotatedFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /*!
> * This method puts any necessary footer information into
> * the report then closes the file.
> *
> - * @param[in] aFile identifies the report file name
> + * @param[in] aFile identifies the file to close
> * @param[in] hasBranches indicates if there are branches to report
> */
> virtual void CloseBranchFile(
> - FILE* aFile,
> + std::ofstream& aFile,
> bool hasBranches
> );
>
> @@ -238,40 +254,40 @@ class ReportsBase {
> * This method puts any necessary footer information into
> * the report then closes the file.
> *
> - * @param[in] aFile identifies the report file name
> + * @param[in] aFile identifies the file to close
> */
> virtual void CloseCoverageFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /*!
> * This method puts any necessary footer information into
> * the report then closes the file.
> *
> - * @param[in] aFile identifies the report file name
> + * @param[in] aFile identifies the file to close
> */
> void CloseNoRangeFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /*!
> * This method puts any necessary footer information into
> * the report then closes the file.
> *
> - * @param[in] aFile identifies the report file name
> + * @param[in] aFile identifies the file to close
> */
> virtual void CloseSizeFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /*!
> * This method puts any necessary footer information into
> * the report then closes the file.
> *
> - * @param[in] aFile identifies the report file name
> + * @param[in] aFile identifies the file to close
> */
> virtual void CloseSymbolSummaryFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /*!
> @@ -284,9 +300,9 @@ class ReportsBase {
> * @param[in] id identifies the branch or range id.
> */
> virtual void PutAnnotatedLine(
> - FILE* aFile,
> + std::ofstream& aFile,
> AnnotatedLineState_t state,
> - std::string line,
> + const std::string& line,
> uint32_t id
> )=0;
>
> @@ -297,7 +313,7 @@ class ReportsBase {
> * @param[in] aFile identifies the report file name
> */
> virtual void AnnotatedStart(
> - FILE* aFile
> + std::ofstream& aFile
> )=0;
>
> /*!
> @@ -307,7 +323,7 @@ class ReportsBase {
> * @param[in] aFile identifies the report file name
> */
> virtual void AnnotatedEnd(
> - FILE* aFile
> + std::ofstream& aFile
> )=0;
>
>
> @@ -318,7 +334,7 @@ class ReportsBase {
> * @param[in] report identifies the report file name
> */
> virtual bool PutNoBranchInfo(
> - FILE* report
> + std::ofstream& report
> ) = 0;
>
> /*!
> @@ -331,7 +347,7 @@ class ReportsBase {
> * @param[in] range is the range information.
> */
> virtual bool PutBranchEntry(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -347,10 +363,10 @@ class ReportsBase {
> * @param[in] symbol is a pointer to the symbol information
> */
> virtual void putCoverageNoRange(
> - FILE* report,
> - FILE* noRangeFile,
> + std::ofstream& report,
> + std::ofstream& noRangeFile,
> unsigned int number,
> - std::string symbol
> + const std::string& symbol
> )=0;
>
> /*!
> @@ -363,7 +379,7 @@ class ReportsBase {
> * @param[in] range is the range information.
> */
> virtual bool PutCoverageLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -379,7 +395,7 @@ class ReportsBase {
> * @param[in] range is the range information.
> */
> virtual bool PutSizeLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const CoverageRanges::coverageRange_t& range
> @@ -394,7 +410,7 @@ class ReportsBase {
> * @param[in] symbolInfo is the symbol's information.
> */
> virtual bool PutSymbolSummaryLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo
> diff --git a/tester/covoar/ReportsHtml.cc b/tester/covoar/ReportsHtml.cc
> index fe75cdd..f9bd21f 100644
> --- a/tester/covoar/ReportsHtml.cc
> +++ b/tester/covoar/ReportsHtml.cc
> @@ -2,6 +2,9 @@
> #include <stdlib.h>
> #include <string.h>
>
> +#include <sstream>
> +#include <iomanip>
> +
> #include <rld.h>
>
> #include "ReportsHtml.h"
> @@ -25,13 +28,13 @@
> "</tr>\n" \
> "</tfoot>\n"
> #else
> -#define TABLE_HEADER_CLASS
> -#define TABLE_FOOTER
> +#define TABLE_HEADER_CLASS ""
> +#define TABLE_FOOTER ""
> #endif
>
> namespace Coverage {
>
> - ReportsHtml::ReportsHtml( time_t timestamp, std::string symbolSetName ):
> + ReportsHtml::ReportsHtml( time_t timestamp, const std::string& symbolSetName ):
> ReportsBase( timestamp, symbolSetName )
> {
> reportExtension_m = ".html";
> @@ -42,63 +45,46 @@ namespace Coverage {
> }
>
> void ReportsHtml::WriteIndex(
> - const char* const fileName
> + const std::string& fileName
> )
> {
> + std::ofstream aFile;
> #define PRINT_ITEM( _t, _n ) \
> - fprintf( \
> - aFile, \
> - "<li>%s (<a href=\"%s.html\">html</a> or "\
> - "<a href=\"%s.txt\">text</a>)</li>\n", \
> - _t, _n, _n );
> + aFile << "<li>" \
> + << _t << " (<a href=\"" \
> + << _n << ".html\">html</a> or <a href=\"" \
> + << _n << ".txt\">text</a>)</li>" << std::endl;
> #define PRINT_TEXT_ITEM( _t, _n ) \
> - fprintf( \
> - aFile, \
> - "<li>%s (<a href=\"%s\">text</a>)</li>\n", \
> - _t, _n );
> + aFile << "<li>" \
> + << _t << " (<a href=\"" \
> + << _n << "\">text</a>)</li>" << std::endl;
>
> - FILE* aFile;
>
> // Open the file
> - aFile = OpenFile( fileName );
> + OpenFile(fileName, aFile);
>
> - fprintf(
> - aFile,
> - "<title>Index</title>\n"
> - "<div class=\"heading-title\">"
> - );
> + aFile << "<title>Index</title>" << std::endl
> + << "<div class=\"heading-title\">";
>
> if (projectName)
> - fprintf(
> - aFile,
> - "%s<br>",
> - projectName
> - );
> -
> - fprintf(
> - aFile,
> - "Coverage Analysis Reports</div>\n"
> - "<div class =\"datetime\">%s</div>\n",
> - asctime( localtime(×tamp_m) )
> - );
> + aFile << projectName << "<br>";
>
> - fprintf( aFile, "<ul>\n" );
> + aFile << "Coverage Analysis Reports</div>" << std::endl
> + << "<div class =\"datetime\">"
> + << asctime( localtime( ×tamp_m ) ) << "</div>" << std::endl
> + << "<ul>" << std::endl;
>
> - PRINT_TEXT_ITEM( "Summary", "summary.txt" );
> - PRINT_ITEM( "Coverage Report", "uncovered" );
> - PRINT_ITEM( "Branch Report", "branch" );
> - PRINT_ITEM( "Annotated Assembly", "annotated" );
> - PRINT_ITEM( "Symbol Summary", "symbolSummary" );
> - PRINT_ITEM( "Uncovered Range Size Report", "sizes" );
> + PRINT_TEXT_ITEM( "Summary", "summary.txt" );
> + PRINT_ITEM( "Coverage Report", "uncovered" );
> + PRINT_ITEM( "Branch Report", "branch" );
> + PRINT_ITEM( "Annotated Assembly", "annotated" );
> + PRINT_ITEM( "Symbol Summary", "symbolSummary" );
> + PRINT_ITEM( "Uncovered Range Size Report", "sizes" );
> + PRINT_TEXT_ITEM( "Explanations Not Found", "ExplanationsNotFound.txt" );
>
> - PRINT_TEXT_ITEM( "Explanations Not Found", "ExplanationsNotFound.txt" );
> -
> - fprintf(
> - aFile,
> - "</ul>\n"
> - "<!-- INSERT PROJECT SPECIFIC ITEMS HERE -->\n"
> - "</html>\n"
> - );
> + aFile << "</ul>" << std::endl
> + << "<!-- INSERT PROJECT SPECIFIC ITEMS HERE -->" << std::endl
> + << "</html>" << std::endl;
>
> CloseFile( aFile );
>
> @@ -106,332 +92,273 @@ namespace Coverage {
> #undef PRINT_TEXT_ITEM
> }
>
> - FILE* ReportsHtml::OpenFile(
> - const char* const fileName
> + void ReportsHtml::OpenFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - FILE* aFile;
> -
> // Open the file
> - aFile = ReportsBase::OpenFile( fileName, symbolSetName_m.c_str() );
> + ReportsBase::OpenFile(fileName, symbolSetName_m, aFile);
>
> // Put Header information on the file
> - fprintf(
> - aFile,
> - "<html>\n"
> - "<meta http-equiv=\"Content-Language\" content=\"English\" >\n"
> - "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" >\n"
> - "<link rel=\"stylesheet\" type=\"text/css\" href=\"../covoar.css\" media=\"screen\" >\n"
> - "<script type=\"text/javascript\" src=\"../table.js\"></script>\n"
> - );
> -
> - return aFile;
> + aFile << "<html>" << std::endl
> + << "<meta http-equiv=\"Content-Language\" content=\"English\" >"
> + << std::endl
> + << "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" >"
> + << std::endl
> + << "<link rel=\"stylesheet\" type=\"text/css\" href=\"../covoar.css\" media=\"screen\" >"
> + << std::endl
> + << "<script type=\"text/javascript\" src=\"../table.js\"></script>"
> + << std::endl;
> }
>
> - FILE* ReportsHtml::OpenAnnotatedFile(
> - const char* const fileName
> + void ReportsHtml::OpenAnnotatedFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - FILE *aFile;
> -
> // Open the file
> - aFile = OpenFile(fileName);
> + OpenFile(fileName, aFile);
>
> - fprintf(
> - aFile,
> - "<title>Annotated Report</title>\n"
> - "<div class=\"heading-title\">"
> - );
> + aFile << "<title>Annotated Report</title>" << std::endl
> + << "<div class=\"heading-title\">";
>
> if (projectName)
> - fprintf(
> - aFile,
> - "%s<br>",
> - projectName
> - );
> -
> - fprintf(
> - aFile,
> - "Annotated Report</div>\n"
> - "<div class =\"datetime\">%s</div>\n"
> - "<body>\n"
> - "<pre class=\"code\">\n",
> - asctime( localtime(×tamp_m) )
> - );
> + aFile << projectName << "<br>";
>
> - return aFile;
> + aFile << "Annotated Report</div>" << std::endl
> + << "<div class =\"datetime\">"
> + << asctime( localtime( ×tamp_m ) ) << "</div>" << std::endl
> + << "<body>" << std::endl
> + << "<pre class=\"code\">" << std::endl;
> }
>
> - FILE* ReportsHtml::OpenBranchFile(
> - const char* const fileName,
> - bool hasBranches
> + void ReportsHtml::OpenBranchFile(
> + const std::string& fileName,
> + bool hasBranches,
> + std::ofstream& aFile
> )
> {
> - FILE *aFile;
> -
> // Open the file
> - aFile = OpenFile(fileName);
> + OpenFile(fileName, aFile);
>
> // Put header information into the file
> - fprintf(
> - aFile,
> - "<title>Branch Report</title>\n"
> - "<div class=\"heading-title\">"
> - );
> + aFile << "<title>Branch Report</title>" << std::endl
> + << "<div class=\"heading-title\">";
>
> if (projectName)
> - fprintf(
> - aFile,
> - "%s<br>",
> - projectName
> - );
> -
> - fprintf(
> - aFile,
> - "Branch Report</div>\n"
> - "<div class =\"datetime\">%s</div>\n"
> - "<body>\n"
> - "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> - TABLE_HEADER_CLASS "\">\n"
> - "<thead>\n"
> - "<tr>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Line</th>\n"
> - "<th class=\"table-filterable table-sortable:default\" align=\"left\">File</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"left\">Size <br>Bytes</th>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Reason</th>\n"
> - "<th class=\"table-filterable table-sortable:default\" align=\"left\">Taken</th>\n"
> - "<th class=\"table-filterable table-sortable:default\" align=\"left\">Not Taken</th>\n"
> - "<th class=\"table-filterable table-sortable:default\" align=\"left\">Classification</th>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Explanation</th>\n"
> - "</tr>\n"
> - "</thead>\n"
> - "<tbody>\n",
> - asctime( localtime(×tamp_m) )
> - );
> -
> - return aFile;
> + aFile << projectName << "<br>";
> +
> + aFile << "Branch Report</div>" << std::endl
> + << "<div class =\"datetime\">"
> + << asctime( localtime( ×tamp_m ) ) << "</div>" << std::endl
> + << "<body>" << std::endl
> + << "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> + << TABLE_HEADER_CLASS << "\">" << std::endl
> + << "<thead>" << std::endl
> + << "<tr>" << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>" << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Line</th>"
> + << std::endl
> + << "<th class=\"table-filterable table-sortable:default\" align=\"left\">File</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"left\">Size <br>Bytes</th>"
> + << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Reason</th>"
> + << std::endl
> + << "<th class=\"table-filterable table-sortable:default\" align=\"left\">Taken</th>"
> + << std::endl
> + << "<th class=\"table-filterable table-sortable:default\" align=\"left\">Not Taken</th>"
> + << std::endl
> + << "<th class=\"table-filterable table-sortable:default\" align=\"left\">Classification</th>"
> + << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Explanation</th>"
> + << std::endl
> + << "</tr>" << std::endl
> + << "</thead>" << std::endl
> + << "<tbody>" << std::endl;
> }
>
> - FILE* ReportsHtml::OpenCoverageFile(
> - const char* const fileName
> + void ReportsHtml::OpenCoverageFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - FILE *aFile;
> -
> // Open the file
> - aFile = OpenFile(fileName);
> + OpenFile(fileName, aFile);
>
> // Put header information into the file
> - fprintf(
> - aFile,
> - "<title>Coverage Report</title>\n"
> - "<div class=\"heading-title\">"
> - );
> + aFile << "<title>Coverage Report</title>" << std::endl
> + << "<div class=\"heading-title\">";
>
> if (projectName)
> - fprintf(
> - aFile,
> - "%s<br>",
> - projectName
> - );
> -
> - fprintf(
> - aFile,
> - "Coverage Report</div>\n"
> - "<div class =\"datetime\">%s</div>\n"
> - "<body>\n"
> - "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> - TABLE_HEADER_CLASS "\">\n"
> - "<thead>\n"
> - "<tr>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Range</th>\n"
> - "<th class=\"table-filterable table-sortable:default\" align=\"left\">File</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"left\">Size <br>Bytes</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"left\">Size <br>Instructions</th>\n"
> - "<th class=\"table-filterable table-sortable:default\" align=\"left\">Classification</th>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Explanation</th>\n"
> - "</tr>\n"
> - "</thead>\n"
> - "<tbody>\n",
> - asctime( localtime(×tamp_m) )
> -
> - );
> -
> - return aFile;
> + aFile << projectName << "<br>";
> +
> + aFile << "Coverage Report</div>" << std::endl
> + << "<div class =\"datetime\">"
> + << asctime( localtime( ×tamp_m ) ) << "</div>" << std::endl
> + << "<body>" << std::endl
> + << "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> + << TABLE_HEADER_CLASS << "\">" << std::endl
> + << "<thead>" << std::endl
> + << "<tr>" << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>"
> + << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Range</th>"
> + << std::endl
> + << "<th class=\"table-filterable table-sortable:default\" align=\"left\">File</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"left\">Size <br>Bytes</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"left\">Size <br>Instructions</th>"
> + << std::endl
> + << "<th class=\"table-filterable table-sortable:default\" align=\"left\">Classification</th>"
> + << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Explanation</th>"
> + << std::endl
> + << "</tr>" << std::endl
> + << "</thead>" << std::endl
> + << "<tbody>" << std::endl;
> }
>
> - FILE* ReportsHtml::OpenNoRangeFile(
> - const char* const fileName
> + void ReportsHtml::OpenNoRangeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - FILE *aFile;
> -
> // Open the file
> - aFile = OpenFile(fileName);
> + OpenFile(fileName, aFile);
>
> // Put header information into the file
> - fprintf(
> - aFile,
> - "<title> Report</title>\n"
> - "<div class=\"heading-title\">"
> - );
> + aFile << "<title> Report</title>" << std::endl
> + << "<div class=\"heading-title\">";
>
> if (projectName)
> - fprintf(
> - aFile,
> - "%s<br>",
> - projectName
> - );
> -
> - fprintf(
> - aFile,
> - "No Range Report</div>\n"
> - "<div class =\"datetime\">%s</div>\n"
> - "<body>\n"
> - "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> - TABLE_HEADER_CLASS "\">\n"
> - "<thead>\n"
> - "<tr>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>\n"
> - "</tr>\n"
> - "</thead>\n"
> - "<tbody>\n",
> - asctime( localtime(×tamp_m) )
> -
> - );
> -
> - return aFile;
> + aFile << projectName << "<br>";
> +
> + aFile << "No Range Report</div>" << std::endl
> + << "<div class =\"datetime\">"
> + << asctime( localtime( ×tamp_m ) ) << "</div>" << std::endl
> + << "<body>" << std::endl
> + << "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> + << TABLE_HEADER_CLASS << "\">" << std::endl
> + << "<thead>" << std::endl
> + << "<tr>" << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>"
> + << std::endl
> + << "</tr>" << std::endl
> + << "</thead>" << std::endl
> + << "<tbody>" << std::endl;
> }
>
>
>
> - FILE* ReportsHtml::OpenSizeFile(
> - const char* const fileName
> + void ReportsHtml::OpenSizeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - FILE *aFile;
> -
> // Open the file
> - aFile = OpenFile(fileName);
> + OpenFile(fileName, aFile);
>
> // Put header information into the file
> - fprintf(
> - aFile,
> - "<title>Uncovered Range Size Report</title>\n"
> - "<div class=\"heading-title\">"
> - );
> + aFile << "<title>Uncovered Range Size Report</title>" << std::endl
> + << "<div class=\"heading-title\">";
>
> if (projectName)
> - fprintf(
> - aFile,
> - "%s<br>",
> - projectName
> - );
> -
> - fprintf(
> - aFile,
> - "Uncovered Range Size Report</div>\n"
> - "<div class =\"datetime\">%s</div>\n"
> - "<body>\n"
> - "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> - TABLE_HEADER_CLASS "\">\n"
> - "<thead>\n"
> - "<tr>\n"
> - "<th class=\"table-sortable:numeric\" align=\"left\">Size</th>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>\n"
> - "<th class=\"table-sortable:default\" align=\"left\">Line</th>\n"
> - "<th class=\"table-filterable table-sortable:default\" align=\"left\">File</th>\n"
> - "</tr>\n"
> - "</thead>\n"
> - "<tbody>\n",
> - asctime( localtime(×tamp_m) )
> -
> - );
> - return aFile;
> + aFile << projectName << "<br>";
> +
> + aFile << "Uncovered Range Size Report</div>" << std::endl
> + << "<div class =\"datetime\">"
> + << asctime( localtime( ×tamp_m ) ) << "</div>" << std::endl
> + << "<body>" << std::endl
> + << "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> + << TABLE_HEADER_CLASS << "\">" << std::endl
> + << "<thead>" << std::endl
> + << "<tr>" << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"left\">Size</th>"
> + << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Symbol</th>"
> + << std::endl
> + << "<th class=\"table-sortable:default\" align=\"left\">Line</th>"
> + << std::endl
> + << "<th class=\"table-filterable table-sortable:default\" align=\"left\">File</th>"
> + << std::endl
> + << "</tr>" << std::endl
> + << "</thead>" << std::endl
> + << "<tbody>" << std::endl;
> }
>
> - FILE* ReportsHtml::OpenSymbolSummaryFile(
> - const char* const fileName
> + void ReportsHtml::OpenSymbolSummaryFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> )
> {
> - FILE *aFile;
> -
> // Open the file
> - aFile = OpenFile(fileName);
> + OpenFile(fileName, aFile);
>
> // Put header information into the file
> - fprintf(
> - aFile,
> - "<title>Symbol Summary Report</title>\n"
> - "<div class=\"heading-title\">"
> - );
> + aFile << "<title>Symbol Summary Report</title>" << std::endl
> + << "<div class=\"heading-title\">";
>
> if (projectName)
> - fprintf(
> - aFile,
> - "%s<br>",
> - projectName
> - );
> -
> - fprintf(
> - aFile,
> - "Symbol Summary Report</div>\n"
> - "<div class =\"datetime\">%s</div>\n"
> - "<body>\n"
> - "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> - TABLE_HEADER_CLASS "\">\n"
> - "<thead>\n"
> - "<tr>\n"
> - "<th class=\"table-sortable:default\" align=\"center\">Symbol</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">Total<br>Size<br>Bytes</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">Total<br>Size<br>Instr</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Ranges</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">Uncovered<br>Size<br>Bytes</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">Uncovered<br>Size<br>Instr</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Branches</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Always<br>Taken</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Never<br>Taken</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">Percent<br>Uncovered<br>Instructions</th>\n"
> - "<th class=\"table-sortable:numeric\" align=\"center\">Percent<br>Uncovered<br>Bytes</th>\n"
> - "</tr>\n"
> - "</thead>\n"
> - "<tbody>\n",
> - asctime( localtime(×tamp_m) )
> -
> - );
> - return aFile;
> + aFile << projectName << "<br>";
> +
> + aFile << "Symbol Summary Report</div>" << std::endl
> + << "<div class =\"datetime\">"
> + << asctime( localtime( ×tamp_m ) ) << "</div>" << std::endl
> + << "<body>" << std::endl
> + << "<table class=\"covoar table-autosort:0 table-autofilter table-stripeclass:covoar-tr-odd"
> + << TABLE_HEADER_CLASS << "\">" << std::endl
> + << "<thead>" << std::endl
> + << "<tr>" << std::endl
> + << "<th class=\"table-sortable:default\" align=\"center\">Symbol</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">Total<br>Size<br>Bytes</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">Total<br>Size<br>Instr</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Ranges</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">Uncovered<br>Size<br>Bytes</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">Uncovered<br>Size<br>Instr</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Branches</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Always<br>Taken</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">#<br>Never<br>Taken</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">Percent<br>Uncovered<br>Instructions</th>"
> + << std::endl
> + << "<th class=\"table-sortable:numeric\" align=\"center\">Percent<br>Uncovered<br>Bytes</th>"
> + << std::endl
> + << "</tr>" << std::endl
> + << "</thead>" << std::endl
> + << "<tbody>" << std::endl;
> }
>
> - void ReportsHtml::AnnotatedStart(
> - FILE* aFile
> - )
> + void ReportsHtml::AnnotatedStart( std::ofstream& aFile )
> {
> - fprintf(
> - aFile,
> - "<hr>\n"
> - );
> + aFile << "<hr>" << std::endl;
> }
>
> - void ReportsHtml::AnnotatedEnd(
> - FILE* aFile
> - )
> + void ReportsHtml::AnnotatedEnd( std::ofstream& aFile )
> {
> }
>
> void ReportsHtml::PutAnnotatedLine(
> - FILE* aFile,
> + std::ofstream& aFile,
> AnnotatedLineState_t state,
> - std::string line,
> + const std::string& line,
> uint32_t id
> )
> {
> std::string stateText;
> - char number[10];
> -
> + std::string number;
>
> - sprintf(number,"%d", id);
> + number = std::to_string( id );
>
> // Set the stateText based upon the current state.
> switch (state) {
> @@ -460,7 +387,7 @@ namespace Coverage {
> stateText += "\"></a><pre class=\"codeNeverTaken\">\n";
> break;
> default:
> - throw rld::error( "Unknown state", "ReportsHtml::PutAnnotatedLine");
> + throw rld::error("Unknown state", "ReportsHtml::PutAnnotatedLine");
> break;
> }
>
> @@ -468,7 +395,7 @@ namespace Coverage {
> // format. If it has changed close out the old format and open up the
> // new format.
> if ( state != lastState_m ) {
> - fprintf( aFile, "%s", stateText.c_str() );
> + aFile << stateText;
> lastState_m = state;
> }
>
> @@ -477,27 +404,27 @@ namespace Coverage {
> // is only a '<' symbol.
> for (unsigned int i=0; i<line.size(); i++ ) {
> if ( line[i] == '<' )
> - fprintf( aFile, "<" );
> + aFile << "<";
> else
> - fprintf( aFile, "%c", line[i] );
> + aFile << line[i];
> }
> - fprintf( aFile, "\n");
> + aFile << std::endl;
> }
>
> bool ReportsHtml::PutNoBranchInfo(
> - FILE* report
> + std::ofstream& report
> )
> {
> if (BranchInfoAvailable &&
> SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) != 0)
> - fprintf( report, "All branch paths taken.\n" );
> + report << "All branch paths taken." << std::endl;
> else
> - fprintf( report, "No branch information found.\n" );
> + report << "No branch information found." << std::endl;
> return true;
> }
>
> bool ReportsHtml::PutBranchEntry(
> - FILE* report,
> + std::ofstream& report,
> unsigned int count,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -513,124 +440,99 @@ namespace Coverage {
>
> // Mark the background color different for odd and even lines.
> if ( ( count%2 ) != 0 )
> - fprintf( report, "<tr class=\"covoar-tr-odd\">\n");
> + report << "<tr class=\"covoar-tr-odd\">\n";
> else
> - fprintf( report, "<tr>\n");
> + report << "<tr>" << std::endl;
>
> // symbol
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - symbolName.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolName << "</td>" << std::endl;
>
> // line
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\"><a href =\"annotated.html#range%d\">%s</td>\n",
> - range.id,
> - range.lowSourceLine.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\"><a href =\"annotated.html#range"
> + << range.id << "\">"
> + << range.lowSourceLine << "</td>" << std::endl;
>
> // File
> i = range.lowSourceLine.find(":");
> temp = range.lowSourceLine.substr (0, i);
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - temp.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << temp << "</td>" << std::endl;
>
> // Size in bytes
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - range.highAddress - range.lowAddress + 1
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << range.highAddress - range.lowAddress + 1 << "</td>" << std::endl;
>
> // Reason Branch was uncovered
> if (range.reason ==
> Coverage::CoverageRanges::UNCOVERED_REASON_BRANCH_ALWAYS_TAKEN)
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">Always Taken</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">Always Taken</td>"
> + << std::endl;
> else if (range.reason ==
> Coverage::CoverageRanges::UNCOVERED_REASON_BRANCH_NEVER_TAKEN)
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">Never Taken</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">Never Taken</td>"
> + << std::endl;
>
> // Taken / Not taken counts
> lowAddress = range.lowAddress;
> bAddress = symbolInfo.baseAddress;
> theCoverageMap = symbolInfo.unifiedCoverageMap;
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - theCoverageMap->getWasTaken( lowAddress - bAddress )
> - );
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - theCoverageMap->getWasNotTaken( lowAddress - bAddress )
> - );
> +
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << theCoverageMap->getWasTaken( lowAddress - bAddress )
> + << "</td>" << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">"
> + << theCoverageMap->getWasNotTaken( lowAddress - bAddress )
> + << "</td>" << std::endl;
>
> // See if an explanation is available and write the Classification and
> // the Explination Columns.
> explanation = AllExplanations->lookupExplanation( range.lowSourceLine );
> if ( !explanation ) {
> // Write Classificationditr->second.baseAddress
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">NONE</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">No Explanation</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">NONE</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">No Explanation</td>"
> + << std::endl;
> } else {
> - char explanationFile[48];
> - sprintf( explanationFile, "explanation%d.html", range.id );
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">"
> - "<a href=\"%s\">Explanation</a></td>\n",
> - explanation->classification.c_str(),
> - explanationFile
> - );
> - WriteExplationFile( explanationFile, explanation );
> + std::stringstream explanationFile( "explanation" );
> + explanationFile << range.id << ".html";
> +
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << explanation->classification << "</td>" << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">"
> + << "<a href=\"" << explanationFile.str()
> + << "\">Explanation</a></td>" << std::endl;
> +
> + WriteExplanationFile( explanationFile.str(), explanation );
> }
>
> - fprintf( report, "</tr>\n");
> + report << "</tr>" << std::endl;
>
> return true;
> }
>
> - bool ReportsHtml::WriteExplationFile(
> - const char* fileName,
> + bool ReportsHtml::WriteExplanationFile(
> + const std::string& fileName,
> const Coverage::Explanation* explanation
> )
> {
> - FILE* report;
> + std::ofstream report;
>
> - report = OpenFile( fileName );
> + OpenFile(fileName, report);
>
> for ( unsigned int i=0 ; i < explanation->explanation.size(); i++) {
> - fprintf(
> - report,
> - "%s\n",
> - explanation->explanation[i].c_str()
> - );
> + report << explanation->explanation[i] << std::endl;
> }
> CloseFile( report );
> return true;
> }
>
> void ReportsHtml::putCoverageNoRange(
> - FILE* report,
> - FILE* noRangeFile,
> + std::ofstream& report,
> + std::ofstream& noRangeFile,
> unsigned int count,
> - std::string symbol
> + const std::string& symbol
> )
> {
> Coverage::Explanation explanation;
> @@ -646,64 +548,50 @@ namespace Coverage {
>
> // Mark the background color different for odd and even lines.
> if ( ( count%2 ) != 0 ){
> - fprintf( report, "<tr class=\"covoar-tr-odd\">\n");
> - fprintf( noRangeFile, "<tr class=\"covoar-tr-odd\">\n");
> + report << "<tr class=\"covoar-tr-odd\">" << std::endl;
> + noRangeFile << "<tr class=\"covoar-tr-odd\">" << std::endl;
> } else {
> - fprintf( report, "<tr>\n");
> - fprintf( noRangeFile, "<tr>\n");
> + report << "<tr>" << std::endl;
> + noRangeFile << "<tr>" << std::endl;
> }
>
> // symbol
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - symbol.c_str()
> - );
> - fprintf(
> - noRangeFile,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - symbol.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbol << "</td>" << std::endl;
> + noRangeFile << "<td class=\"covoar-td\" align=\"center\">"
> + << symbol << "</td>" << std::endl;
>
> // starting line
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl;
>
> // file
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl;
>
> // Size in bytes
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl;
>
> // Size in instructions
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl;
>
> // See if an explanation is available
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">Unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">"
> - "<a href=\"NotReferenced.html\">No data</a></td>\n"
> - );
> - WriteExplationFile( "NotReferenced.html", &explanation );
> + report << "<td class=\"covoar-td\" align=\"center\">Unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">"
> + << "<a href=\"NotReferenced.html\">No data</a></td>"
> + << std::endl;
> +
> + WriteExplanationFile( "NotReferenced.html", &explanation );
>
> - fprintf( report, "</tr>\n");
> - fprintf( noRangeFile, "</tr>\n");
> + report << "</tr>" << std::endl;
> + noRangeFile << "</tr>" << std::endl;
> }
>
> bool ReportsHtml::PutCoverageLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int count,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -715,83 +603,65 @@ namespace Coverage {
> int i;
>
> // Mark the background color different for odd and even lines.
> - if ( ( count%2 ) != 0 )
> - fprintf( report, "<tr class=\"covoar-tr-odd\">\n");
> + if ( ( count% 2) != 0 )
> + report << "<tr class=\"covoar-tr-odd\">" << std::endl;
> else
> - fprintf( report, "<tr>\n");
> + report << "<tr>" << std::endl;
>
> // symbol
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - symbolName.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolName << "</td>" << std::endl;
>
> // Range
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\"><a href =\"annotated.html#range%d\">%s <br>%s</td>\n",
> - range.id,
> - range.lowSourceLine.c_str(),
> - range.highSourceLine.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\"><a href =\"annotated.html#range"
> + << range.id << "\">"
> + << range.lowSourceLine << " <br>"
> + << range.highSourceLine << "</td>" << std::endl;
>
> // File
> i = range.lowSourceLine.find(":");
> temp = range.lowSourceLine.substr (0, i);
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - temp.c_str()
> - );
> +
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << temp << "</td>" << std::endl;
>
> // Size in bytes
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - range.highAddress - range.lowAddress + 1
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << range.highAddress - range.lowAddress + 1 << "</td>" << std::endl;
>
> // Size in instructions
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - range.instructionCount
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << range.instructionCount << "</td>" << std::endl;
>
> // See if an explanation is available
> explanation = AllExplanations->lookupExplanation( range.lowSourceLine );
> if ( !explanation ) {
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">NONE</td>\n"
> - );
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">No Explanation</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">NONE</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">No Explanation</td>"
> + << std::endl;
> } else {
> - char explanationFile[48];
> -
> - sprintf( explanationFile, "explanation%d.html", range.id );
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">"
> - "<a href=\"%s\">Explanation</a></td>\n",
> - explanation->classification.c_str(),
> - explanationFile
> - );
> - WriteExplationFile( explanationFile, explanation );
> + std::stringstream explanationFile( "explanation" );
> +
> + explanationFile << range.id << ".html";
> +
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << explanation->classification << "</td>" << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">"
> + << "<a href=\""
> + << explanationFile.str() << "\">Explanation</a></td>"
> + << std::endl;
> +
> + WriteExplanationFile( explanationFile.str(), explanation );
> }
>
> - fprintf( report, "</tr>\n");
> + report << "</tr>" << std::endl;
>
> return true;
> }
>
> bool ReportsHtml::PutSizeLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int count,
> const std::string& symbolName,
> const CoverageRanges::coverageRange_t& range
> @@ -802,48 +672,35 @@ namespace Coverage {
>
> // Mark the background color different for odd and even lines.
> if ( ( count%2 ) != 0 )
> - fprintf( report, "<tr class=\"covoar-tr-odd\">\n");
> + report << "<tr class=\"covoar-tr-odd\">" << std::endl;
> else
> - fprintf( report, "<tr>\n");
> + report << "<tr>" << std::endl;
>
> // size
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - range.highAddress - range.lowAddress + 1
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << range.highAddress - range.lowAddress + 1 << "</td>" << std::endl;
>
> // symbol
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - symbolName.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolName << "</td>" << std::endl;
>
> // line
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\"><a href =\"annotated.html#range%d\">%s</td>\n",
> - range.id,
> - range.lowSourceLine.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\"><a href =\"annotated.html#range"
> + << range.id << "\">"
> + << range.lowSourceLine << "</td>" << std::endl;
>
> // File
> i = range.lowSourceLine.find(":");
> temp = range.lowSourceLine.substr (0, i);
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - temp.c_str()
> - );
> -
> - fprintf( report, "</tr>\n");
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << temp << "</td>" << std::endl
> + << "</tr>" << std::endl;
>
> return true;
> }
>
> bool ReportsHtml::PutSymbolSummaryLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int count,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo
> @@ -852,216 +709,173 @@ namespace Coverage {
>
> // Mark the background color different for odd and even lines.
> if ( ( count%2 ) != 0 )
> - fprintf( report, "<tr class=\"covoar-tr-odd\">\n");
> + report << "<tr class=\"covoar-tr-odd\">" << std::endl;
> else
> - fprintf( report, "<tr>\n");
> + report << "<tr>" << std::endl;
>
> // symbol
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%s</td>\n",
> - symbolName.c_str()
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolName << "</td>" << std::endl;
>
> if (symbolInfo.stats.sizeInBytes == 0) {
> // The symbol has never been seen. Write "unknown" for all columns.
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - "<td class=\"covoar-td\" align=\"center\">unknown</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl
> + << "<td class=\"covoar-td\" align=\"center\">unknown</td>"
> + << std::endl;
> } else {
> // Total Size in Bytes
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.sizeInBytes
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.sizeInBytes << "</td>" << std::endl;
>
> // Total Size in Instructions
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.sizeInInstructions
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.sizeInInstructions << "</td>" << std::endl;
>
> // Total Uncovered Ranges
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.uncoveredRanges
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.uncoveredRanges << "</td>" << std::endl;
>
> // Uncovered Size in Bytes
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.uncoveredBytes
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.uncoveredBytes << "</td>" << std::endl;
>
> // Uncovered Size in Instructions
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.uncoveredInstructions
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.uncoveredInstructions << "</td>" << std::endl;
>
> // Total number of branches
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.branchesNotExecuted + symbolInfo.stats.branchesExecuted
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.branchesNotExecuted +
> + symbolInfo.stats.branchesExecuted
> + << "</td>" << std::endl;
>
> // Total Always Taken
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.branchesAlwaysTaken
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.branchesAlwaysTaken << "</td>" << std::endl;
>
> // Total Never Taken
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%d</td>\n",
> - symbolInfo.stats.branchesNeverTaken
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << symbolInfo.stats.branchesNeverTaken << "</td>" << std::endl;
>
> // % Uncovered Instructions
> if ( symbolInfo.stats.sizeInInstructions == 0 )
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">100.00</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">100.00</td>"
> + << std::endl;
> else
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%.2f</td>\n",
> - (symbolInfo.stats.uncoveredInstructions*100.0)/
> - symbolInfo.stats.sizeInInstructions
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << std::fixed << std::setprecision( 2 )
> + << ( symbolInfo.stats.uncoveredInstructions * 100.0 ) /
> + symbolInfo.stats.sizeInInstructions
> + << "</td>" << std::endl;
>
> // % Uncovered Bytes
> if ( symbolInfo.stats.sizeInBytes == 0 )
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">100.00</td>\n"
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">100.00</td>"
> + << std::endl;
> else
> - fprintf(
> - report,
> - "<td class=\"covoar-td\" align=\"center\">%.2f</td>\n",
> - (symbolInfo.stats.uncoveredBytes*100.0)/
> - symbolInfo.stats.sizeInBytes
> - );
> + report << "<td class=\"covoar-td\" align=\"center\">"
> + << ( symbolInfo.stats.uncoveredBytes * 100.0 ) /
> + symbolInfo.stats.sizeInBytes
> + << "</td>" << std::endl;
> }
>
> - fprintf( report, "</tr>\n");
> + report << "</tr>" << std::endl;
> return true;
> }
>
> void ReportsHtml::CloseAnnotatedFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> - fprintf(
> - aFile,
> - "</pre>\n"
> - "</body>\n"
> - "</html>"
> - );
> + aFile << "</pre>" << std::endl
> + << "</body>" << std::endl
> + << "</html>" << std::endl;
>
> CloseFile(aFile);
> }
>
> void ReportsHtml::CloseBranchFile(
> - FILE* aFile,
> + std::ofstream& aFile,
> bool hasBranches
> )
> {
> - fprintf(
> - aFile,
> - TABLE_FOOTER
> - "</tbody>\n"
> - "</table>\n"
> - );
> + aFile << TABLE_FOOTER
> + << "</tbody>" << std::endl
> + << "</table>" << std::endl;
>
> CloseFile(aFile);
> }
>
> void ReportsHtml::CloseCoverageFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> - fprintf(
> - aFile,
> - TABLE_FOOTER
> - "</tbody>\n"
> - "</table>\n"
> - "</pre>\n"
> - "</body>\n"
> - "</html>"
> - );
> + aFile << TABLE_FOOTER
> + << "</tbody>" << std::endl
> + << "</table>" << std::endl
> + << "</pre>" << std::endl
> + << "</body>" << std::endl
> + << "</html>";
>
> CloseFile(aFile);
> }
>
> void ReportsHtml::CloseNoRangeFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> - fprintf(
> - aFile,
> - TABLE_FOOTER
> - "</tbody>\n"
> - "</table>\n"
> - "</pre>\n"
> - "</body>\n"
> - "</html>"
> - );
> + aFile << TABLE_FOOTER
> + << "</tbody>" << std::endl
> + << "</table>" << std::endl
> + << "</pre>" << std::endl
> + << "</body>" << std::endl
> + << "</html>";
>
> CloseFile(aFile);
> }
>
>
> void ReportsHtml::CloseSizeFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> - fprintf(
> - aFile,
> - TABLE_FOOTER
> - "</tbody>\n"
> - "</table>\n"
> - "</pre>\n"
> - "</body>\n"
> - "</html>"
> - );
> + aFile << TABLE_FOOTER
> + << "</tbody>" << std::endl
> + << "</table>" << std::endl
> + << "</pre>" << std::endl
> + << "</body>" << std::endl
> + << "</html>";
>
> - CloseFile( aFile );
> + CloseFile(aFile);
> }
>
> void ReportsHtml::CloseSymbolSummaryFile(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> - fprintf(
> - aFile,
> - TABLE_FOOTER
> - "</tbody>\n"
> - "</table>\n"
> - "</pre>\n"
> - "</body>\n"
> - "</html>"
> - );
> + aFile << TABLE_FOOTER
> + << "</tbody>" << std::endl
> + << "</table>" << std::endl
> + << "</pre>" << std::endl
> + << "</body>" << std::endl
> + << "</html>";
>
> CloseFile( aFile );
> }
> diff --git a/tester/covoar/ReportsHtml.h b/tester/covoar/ReportsHtml.h
> index 8d209ae..21ca8bd 100644
> --- a/tester/covoar/ReportsHtml.h
> +++ b/tester/covoar/ReportsHtml.h
> @@ -9,6 +9,9 @@
> #ifndef __REPORTSHTML_H__
> #define __REPORTSHTML_H__
>
> +#include <string>
> +#include <fstream>
> +
> #include <stdint.h>
> #include "ReportsBase.h"
> #include "Explanations.h"
> @@ -22,7 +25,7 @@ namespace Coverage {
> class ReportsHtml: public ReportsBase {
>
> public:
> - ReportsHtml( time_t timestamp, std::string symbolSetName );
> + ReportsHtml( time_t timestamp, const std::string& symbolSetName );
> ~ReportsHtml();
>
> /*!
> @@ -31,8 +34,8 @@ class ReportsHtml: public ReportsBase {
> * @param[in] fileName identifies the file name.
> */
> void WriteIndex(
> - const char* const fileName
> - );
> + const std::string& fileName
> + ) override;
>
> /*!
> * This method produces a report that contains information about each
> @@ -41,7 +44,7 @@ class ReportsHtml: public ReportsBase {
> * @param[in] fileName identifies the branch report file name
> */
> void WriteBranchReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -51,7 +54,7 @@ class ReportsHtml: public ReportsBase {
> * @param[in] fileName identifies the coverage report file name
> */
> void WriteCoverageReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -61,7 +64,7 @@ class ReportsHtml: public ReportsBase {
> * @param[in] fileName identifies the size report file name
> */
> void WriteSizeReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> protected:
> @@ -75,93 +78,99 @@ class ReportsHtml: public ReportsBase {
> AnnotatedLineState_t lastState_m;
>
> /* Inherit documentation from base class. */
> - virtual FILE* OpenAnnotatedFile(
> - const char* const fileName
> + virtual void OpenAnnotatedFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> - virtual FILE* OpenBranchFile(
> - const char* const fileName,
> - bool hasBranches
> + virtual void OpenBranchFile(
> + const std::string& fileName,
> + bool hasBranches,
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> - virtual FILE* OpenCoverageFile(
> - const char* const fileName
> + virtual void OpenCoverageFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> - FILE* OpenNoRangeFile(
> - const char* const fileName
> + void OpenNoRangeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> - virtual FILE* OpenSizeFile(
> - const char* const fileName
> + virtual void OpenSizeFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> - virtual FILE* OpenSymbolSummaryFile(
> - const char* const fileName
> + virtual void OpenSymbolSummaryFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual void CloseAnnotatedFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual void CloseBranchFile(
> - FILE* aFile,
> + std::ofstream& aFile,
> bool hasBranches
> );
>
> /* Inherit documentation from base class. */
> virtual void CloseCoverageFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> void CloseNoRangeFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual void CloseSizeFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual void CloseSymbolSummaryFile(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual void PutAnnotatedLine(
> - FILE* aFile,
> + std::ofstream& aFile,
> AnnotatedLineState_t state,
> - std::string line,
> + const std::string& line,
> uint32_t id
> );
>
> /* Inherit documentation from base class. */
> virtual void AnnotatedStart(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual void AnnotatedEnd(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual bool PutNoBranchInfo(
> - FILE* report
> + std::ofstream& report
> );
>
> /* Inherit documentation from base class. */
> virtual bool PutBranchEntry(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -170,15 +179,15 @@ class ReportsHtml: public ReportsBase {
>
> /* Inherit documentation from base class. */
> virtual void putCoverageNoRange(
> - FILE* report,
> - FILE* noRangeFile,
> - unsigned int number,
> - std::string symbol
> + std::ofstream& report,
> + std::ofstream& noRangeFile,
> + unsigned int number,
> + const std::string& symbol
> );
>
> /* Inherit documentation from base class. */
> virtual bool PutCoverageLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -187,7 +196,7 @@ class ReportsHtml: public ReportsBase {
>
> /* Inherit documentation from base class. */
> virtual bool PutSizeLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const CoverageRanges::coverageRange_t& range
> @@ -195,20 +204,21 @@ class ReportsHtml: public ReportsBase {
>
> /* Inherit documentation from base class. */
> virtual bool PutSymbolSummaryLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo
> );
>
> /* Inherit documentation from base class. */
> - virtual FILE* OpenFile(
> - const char* const fileName
> + virtual void OpenFile(
> + const std::string& fileName,
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> - virtual bool WriteExplationFile(
> - const char* fileName,
> + virtual bool WriteExplanationFile(
> + const std::string& fileName,
> const Coverage::Explanation* explanation
> );
> };
> diff --git a/tester/covoar/ReportsText.cc b/tester/covoar/ReportsText.cc
> index 33be32f..35ad786 100644
> --- a/tester/covoar/ReportsText.cc
> +++ b/tester/covoar/ReportsText.cc
> @@ -1,6 +1,8 @@
> #include <stdio.h>
> #include <string.h>
>
> +#include <iomanip>
> +
> #include "ReportsText.h"
> #include "app_common.h"
> #include "CoverageRanges.h"
> @@ -11,7 +13,7 @@
>
> namespace Coverage {
>
> -ReportsText::ReportsText( time_t timestamp, std::string symbolSetName ):
> +ReportsText::ReportsText( time_t timestamp, const std::string& symbolSetName ):
> ReportsBase( timestamp, symbolSetName )
> {
> reportExtension_m = ".txt";
> @@ -22,47 +24,44 @@ ReportsText::~ReportsText()
> }
>
> void ReportsText::AnnotatedStart(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> - fprintf(
> - aFile,
> - "========================================"
> - "=======================================\n"
> - );
> + aFile << "========================================"
> + << "=======================================" << std::endl;
> }
>
> void ReportsText::AnnotatedEnd(
> - FILE* aFile
> + std::ofstream& aFile
> )
> {
> }
>
> void ReportsText::PutAnnotatedLine(
> - FILE* aFile,
> + std::ofstream& aFile,
> AnnotatedLineState_t state,
> - std::string line,
> + const std::string& line,
> uint32_t id
> )
> {
> - fprintf( aFile, "%s\n", line.c_str());
> + aFile << line << std::endl;
> }
>
> bool ReportsText::PutNoBranchInfo(
> - FILE* report
> + std::ofstream& report
> )
> {
> if ( BranchInfoAvailable &&
> SymbolsToAnalyze->getNumberBranchesFound(symbolSetName_m) != 0 )
> - fprintf( report, "All branch paths taken.\n" );
> + report << "All branch paths taken." << std::endl;
> else
> - fprintf( report, "No branch information found.\n" );
> + report << "No branch information found." << std::endl;
> return true;
> }
>
>
> bool ReportsText::PutBranchEntry(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -72,90 +71,71 @@ bool ReportsText::PutBranchEntry(
> const Coverage::Explanation* explanation;
>
> // Add an entry to the report
> - fprintf(
> - report,
> - "============================================\n"
> - "Symbol : %s (0x%x)\n"
> - "Line : %s (0x%x)\n"
> - "Size in Bytes : %d\n",
> - symbolName.c_str(),
> - symbolInfo.baseAddress,
> - range.lowSourceLine.c_str(),
> - range.lowAddress,
> - range.highAddress - range.lowAddress + 1
> - );
> + report << "============================================" << std::endl
> + << "Symbol : " << symbolName
> + << std::hex << " (0x" << symbolInfo.baseAddress << ")" << std::endl
> + << "Line : " << range.lowSourceLine
> + << " (0x" << range.lowAddress << ")" << std::endl
> + << "Size in Bytes : " << range.highAddress - range.lowAddress + 1
> + << std::dec << std::endl;
>
> if (range.reason ==
> Coverage::CoverageRanges::UNCOVERED_REASON_BRANCH_ALWAYS_TAKEN)
> - fprintf(
> - report, "Reason : %s\n\n", "ALWAYS TAKEN"
> - );
> + report << "Reason : ALWAYS TAKEN"
> + << std::endl << std::endl;
> else if (range.reason ==
> Coverage::CoverageRanges::UNCOVERED_REASON_BRANCH_NEVER_TAKEN)
> - fprintf( report, "Reason : %s\n\n", "NEVER TAKEN" );
> + report << "Reason : NEVER TAKEN"
> + << std::endl << std::endl;
>
> // See if an explanation is available
> explanation = AllExplanations->lookupExplanation( range.lowSourceLine );
>
> if ( !explanation ) {
> - fprintf(
> - report,
> - "Classification: NONE\n"
> - "\n"
> - "Explanation:\n"
> - "No Explanation\n"
> - );
> + report << "Classification: NONE" << std::endl << std::endl
> + << "Explanation:" << std::endl
> + << "No Explanation" << std::endl;
> } else {
> - fprintf(
> - report,
> - "Classification: %s\n"
> - "\n"
> - "Explanation:\n",
> - explanation->classification.c_str()
> - );
> -
> - for ( unsigned int i=0 ;
> + report << "Classification: " << explanation->classification
> + << std::endl << std::endl
> + << "Explanation:" << std::endl;
> +
> + for ( unsigned int i=0;
> i < explanation->explanation.size();
> i++) {
> - fprintf(
> - report,
> - "%s\n",
> - explanation->explanation[i].c_str()
> - );
> + report << explanation->explanation[i] << std::endl;
> }
> }
>
> - fprintf(
> - report, "============================================\n"
> - );
> + report << "============================================" << std::endl;
>
> return true;
> }
>
> void ReportsText::putCoverageNoRange(
> - FILE* report,
> - FILE* noRangeFile,
> + std::ofstream& report,
> + std::ofstream& noRangeFile,
> unsigned int number,
> - std::string symbol
> + const std::string& symbol
> )
> {
> - fprintf(
> - report,
> - "============================================\n"
> - "Symbol : %s\n\n"
> - " *** NEVER REFERENCED ***\n\n"
> - "This symbol was never referenced by an analyzed executable.\n"
> - "Therefore there is no size or disassembly for this symbol.\n"
> - "This could be due to symbol misspelling or lack of a test for\n"
> - "this symbol.\n"
> - "============================================\n",
> - symbol.c_str()
> - );
> - fprintf( noRangeFile, "%s\n", symbol.c_str() );
> + report << "============================================" << std::endl
> + << "Symbol : " << symbol << std::endl << std::endl
> + << " *** NEVER REFERENCED ***" << std::endl << std::endl
> + << "This symbol was never referenced by an analyzed executable."
> + << std::endl
> + << "Therefore there is no size or disassembly for this symbol."
> + << std::endl
> + << "This could be due to symbol misspelling or lack of a test for"
> + << std::endl
> + << "this symbol." << std::endl
> + << "============================================" << std::endl;
> +
> + noRangeFile << symbol << std::endl;
> }
>
> bool ReportsText::PutCoverageLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -164,73 +144,56 @@ bool ReportsText::PutCoverageLine(
> {
> const Coverage::Explanation* explanation;
>
> - fprintf(
> - report,
> - "============================================\n"
> - "Index : %d\n"
> - "Symbol : %s (0x%x)\n"
> - "Starting Line : %s (0x%x)\n"
> - "Ending Line : %s (0x%x)\n"
> - "Size in Bytes : %d\n"
> - "Size in Instructions : %d\n\n",
> - range.id,
> - symbolName.c_str(),
> - symbolInfo.baseAddress,
> - range.lowSourceLine.c_str(),
> - range.lowAddress,
> - range.highSourceLine.c_str(),
> - range.highAddress,
> - range.highAddress - range.lowAddress + 1,
> - range.instructionCount
> - );
> + report << "============================================" << std::endl
> + << "Index : " << range.id << std::endl
> + << "Symbol : " << symbolName
> + << std::hex << " (0x" << symbolInfo.baseAddress << ")" << std::endl
> + << "Starting Line : " << range.lowSourceLine
> + << " (0x" << range.lowAddress << ")" << std::endl
> + << "Ending Line : " << range.highSourceLine
> + << " (0x" << range.highAddress << ")" << std::endl
> + << std::dec
> + << "Size in Bytes : "
> + << range.highAddress - range.lowAddress + 1 << std::endl
> + << "Size in Instructions : " << range.instructionCount
> + << std::endl << std::endl;
>
> explanation = AllExplanations->lookupExplanation( range.lowSourceLine );
>
> if ( !explanation ) {
> - fprintf(
> - report,
> - "Classification: NONE\n"
> - "\n"
> - "Explanation:\n"
> - "No Explanation\n"
> - );
> + report << "Classification: NONE" << std::endl << std::endl
> + << "Explanation:" << std::endl
> + << "No Explanation" << std::endl;
> } else {
> - fprintf(
> - report,
> - "Classification: %s\n"
> - "\n"
> - "Explanation:\n",
> - explanation->classification.c_str()
> - );
> + report << "Classification: " << explanation->classification << std::endl
> + << std::endl
> + << "Explanation:" << std::endl;
>
> for ( unsigned int i=0; i < explanation->explanation.size(); i++) {
> - fprintf( report,"%s\n", explanation->explanation[i].c_str() );
> + report << explanation->explanation[i] << std::endl;
> }
> }
>
> - fprintf(report, "============================================\n");
> + report << "============================================" << std::endl;
> return true;
> }
>
> bool ReportsText::PutSizeLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const CoverageRanges::coverageRange_t& range
> )
> {
> - fprintf(
> - report,
> - "%d\t%s\t%s\n",
> - range.highAddress - range.lowAddress + 1,
> - symbolName.c_str(),
> - range.lowSourceLine.c_str()
> - );
> + report << range.highAddress - range.lowAddress + 1 << '\t'
> + << symbolName << '\t'
> + << range.lowSourceLine << std::endl;
> +
> return true;
> }
>
> bool ReportsText::PutSymbolSummaryLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo
> @@ -240,17 +203,18 @@ bool ReportsText::PutSymbolSummaryLine(
> float uncoveredInstructions;
>
> if (symbolInfo.stats.sizeInBytes == 0) {
> - fprintf(
> - report,
> - "============================================\n"
> - "Symbol : %s\n"
> - " *** NEVER REFERENCED ***\n\n"
> - "This symbol was never referenced by an analyzed executable.\n"
> - "Therefore there is no size or disassembly for this symbol.\n"
> - "This could be due to symbol misspelling or lack of a test for\n"
> - "this symbol.\n",
> - symbolName.c_str()
> - );
> + report << "============================================" << std::endl
> + << "Symbol : " << symbolName << std::endl
> + << " *** NEVER REFERENCED ***"
> + << std::endl << std::endl
> + << "This symbol was never referenced by an analyzed executable."
> + << std::endl
> + << "Therefore there is no size or disassembly for this symbol."
> + << std::endl
> + << "This could be due to symbol misspelling or lack of a test for"
> + << std::endl
> + << "this symbol." << std::endl
> + << "============================================" << std::endl;
> } else {
> if ( symbolInfo.stats.sizeInInstructions == 0 )
> uncoveredInstructions = 0;
> @@ -264,29 +228,30 @@ bool ReportsText::PutSymbolSummaryLine(
> uncoveredBytes = (symbolInfo.stats.uncoveredBytes*100.0)/
> symbolInfo.stats.sizeInBytes;
>
> - fprintf(
> - report,
> - "============================================\n"
> - "Symbol : %s\n"
> - "Total Size in Bytes : %d\n"
> - "Total Size in Instructions : %d\n"
> - "Total number Branches : %d\n"
> - "Total Always Taken : %d\n"
> - "Total Never Taken : %d\n"
> - "Percentage Uncovered Instructions : %.2f\n"
> - "Percentage Uncovered Bytes : %.2f\n",
> - symbolName.c_str(),
> - symbolInfo.stats.sizeInBytes,
> - symbolInfo.stats.sizeInInstructions,
> - symbolInfo.stats.branchesNotExecuted + symbolInfo.stats.branchesExecuted,
> - symbolInfo.stats.branchesAlwaysTaken,
> - symbolInfo.stats.branchesNeverTaken,
> - uncoveredInstructions,
> - uncoveredBytes
> - );
> + report << "============================================" << std::endl
> + << "Symbol : "
> + << symbolName << std::endl
> + << "Total Size in Bytes : "
> + << symbolInfo.stats.sizeInBytes << std::endl
> + << "Total Size in Instructions : "
> + << symbolInfo.stats.sizeInInstructions << std::endl
> + << "Total number Branches : "
> + << symbolInfo.stats.branchesNotExecuted +
> + symbolInfo.stats.branchesExecuted
> + << std::endl
> + << "Total Always Taken : "
> + << symbolInfo.stats.branchesAlwaysTaken << std::endl
> + << "Total Never Taken : "
> + << symbolInfo.stats.branchesNeverTaken << std::endl
> + << std::fixed << std::setprecision( 2 )
> + << "Percentage Uncovered Instructions : "
> + << uncoveredInstructions << std::endl
> + << "Percentage Uncovered Bytes : "
> + << uncoveredBytes << std::endl;
> +
> + report << "============================================" << std::endl;
> }
>
> - fprintf(report, "============================================\n");
> return true;
> }
>
> diff --git a/tester/covoar/ReportsText.h b/tester/covoar/ReportsText.h
> index 23a1003..3e33be9 100644
> --- a/tester/covoar/ReportsText.h
> +++ b/tester/covoar/ReportsText.h
> @@ -21,7 +21,7 @@ namespace Coverage {
> class ReportsText: public ReportsBase {
>
> public:
> - ReportsText( time_t timestamp, std::string symbolSetName );
> + ReportsText( time_t timestamp, const std::string& symbolSetName );
> virtual ~ReportsText();
>
> /*!
> @@ -31,7 +31,7 @@ class ReportsText: public ReportsBase {
> * @param[in] fileName identifies the branch report file name
> */
> void WriteBranchReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -41,7 +41,7 @@ class ReportsText: public ReportsBase {
> * @param[in] fileName identifies the coverage report file name
> */
> void WriteCoverageReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> /*!
> @@ -51,37 +51,37 @@ class ReportsText: public ReportsBase {
> * @param[in] fileName identifies the size report file name
> */
> void WriteSizeReport(
> - const char* const fileName
> + const std::string& fileName
> );
>
> protected:
>
> /* Inherit documentation from base class. */
> virtual void PutAnnotatedLine(
> - FILE* aFile,
> + std::ofstream& aFile,
> AnnotatedLineState_t state,
> - std::string line,
> + const std::string& line,
> uint32_t id
> );
>
> /* Inherit documentation from base class. */
> virtual void AnnotatedStart(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual void AnnotatedEnd(
> - FILE* aFile
> + std::ofstream& aFile
> );
>
> /* Inherit documentation from base class. */
> virtual bool PutNoBranchInfo(
> - FILE* report
> + std::ofstream& report
> );
>
> /* Inherit documentation from base class. */
> virtual bool PutBranchEntry(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -90,15 +90,15 @@ class ReportsText: public ReportsBase {
>
> /* Inherit documentation from base class. */
> virtual void putCoverageNoRange(
> - FILE* report,
> - FILE* noRangeFile,
> - unsigned int number,
> - std::string symbol
> + std::ofstream& report,
> + std::ofstream& noRangeFile,
> + unsigned int number,
> + const std::string& symbol
> );
>
> /* Inherit documentation from base class. */
> virtual bool PutCoverageLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo,
> @@ -107,7 +107,7 @@ class ReportsText: public ReportsBase {
>
> /* Inherit documentation from base class. */
> virtual bool PutSizeLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const CoverageRanges::coverageRange_t& range
> @@ -115,7 +115,7 @@ class ReportsText: public ReportsBase {
>
> /* Inherit documentation from base class. */
> virtual bool PutSymbolSummaryLine(
> - FILE* report,
> + std::ofstream& report,
> unsigned int number,
> const std::string& symbolName,
> const SymbolInformation& symbolInfo
>
More information about the devel
mailing list