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 > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel