| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | #include "cmStandardIncludes.h"#include "cmSystemTools.h"#include "cmXMLParser.h"#include "cmParsePythonCoverage.h"#include <cmsys/Directory.hxx>#include <cmsys/FStream.hxx>//----------------------------------------------------------------------------class cmParsePythonCoverage::XMLParser: public cmXMLParser{public:  XMLParser(cmCTest* ctest, cmCTestCoverageHandlerContainer& cont)    : CTest(ctest), Coverage(cont)  {  }  virtual ~XMLParser()  {  }protected:  virtual void StartElement(const char* name, const char** atts)  {    if(strcmp(name, "class") == 0)    {      int tagCount = 0;      while(true)      {        if(strcmp(atts[tagCount], "filename") == 0)        {          cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, "Reading file: "                     << atts[tagCount+1] << std::endl);          this->CurFileName = this->Coverage.SourceDir + "/" +                                 atts[tagCount+1];          FileLinesType& curFileLines =            this->Coverage.TotalCoverage[this->CurFileName];          cmsys::ifstream fin(this->CurFileName.c_str());          if(!fin)          {            cmCTestLog(this->CTest, ERROR_MESSAGE,                       "Python Coverage: Error opening " << this->CurFileName                       << std::endl);            this->Coverage.Error++;            break;          }          std::string line;          curFileLines.push_back(-1);          while(cmSystemTools::GetLineFromStream(fin, line))          {            curFileLines.push_back(-1);          }          break;        }        ++tagCount;      }    }    else if(strcmp(name, "line") == 0)    {      int tagCount = 0;      int curNumber = -1;      int curHits = -1;      while(true)      {        if(strcmp(atts[tagCount], "hits") == 0)        {          curHits = atoi(atts[tagCount+1]);        }        else if(strcmp(atts[tagCount], "number") == 0)        {          curNumber = atoi(atts[tagCount+1]);        }        if(curHits > -1 && curNumber > -1)        {          FileLinesType& curFileLines =            this->Coverage.TotalCoverage[this->CurFileName];          curFileLines[curNumber] = curHits;          break;        }        ++tagCount;      }    }  }  virtual void EndElement(const char*) {}private:  typedef cmCTestCoverageHandlerContainer::SingleFileCoverageVector     FileLinesType;  cmCTest* CTest;  cmCTestCoverageHandlerContainer& Coverage;  std::string CurFileName;};cmParsePythonCoverage::cmParsePythonCoverage(    cmCTestCoverageHandlerContainer& cont,    cmCTest* ctest)    :Coverage(cont), CTest(ctest){}bool cmParsePythonCoverage::ReadCoverageXML(const char* xmlFile){  cmParsePythonCoverage::XMLParser parser(this->CTest, this->Coverage);  parser.ParseFile(xmlFile);  return true;}
 |