From baf5601acb6c9fcf7357d48d53e4e9f0f107bb2b Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Sat, 2 Jul 2005 22:50:57 -0400 Subject: [PATCH] ENH: Improve performance of MakeXMLSafe, improve performance of reading custom ctest files, and remove error when running ctest on directory without DartConfiguration.tcl --- Source/cmCTest.cxx | 154 ++++++++++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 72 deletions(-) diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index e7017c5d8..50234f7c8 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -139,45 +139,47 @@ std::string cmCTest::CurrentTime() //---------------------------------------------------------------------- std::string cmCTest::MakeXMLSafe(const std::string& str) { - cmOStringStream ost; - // By uncommenting the lcnt code, it will put newline every 120 characters - //int lcnt = 0; - for (std::string::size_type pos = 0; pos < str.size(); pos ++ ) + std::vector result; + result.reserve(500); + const char* pos = str.c_str(); + for ( ;*pos; ++pos) { - unsigned char ch = str[pos]; - if ( ch == '\r' ) - { - // Ignore extra CR characters. - } - else if ( (ch > 126 || ch < 32) && ch != 9 && ch != 10 && ch != 13 ) + char ch = *pos; + if ( (ch > 126 || ch < 32) && ch != 9 && ch != 10 && ch != 13 && ch != '\r' ) { char buffer[33]; sprintf(buffer, "<%d>", (int)ch); //sprintf(buffer, "&#x%0x;", (unsigned int)ch); - ost << buffer; - //lcnt += 4; + result.insert(result.end(), buffer, buffer+strlen(buffer)); } else { + const char* const encodedChars[] = { + "&", + "<", + ">" + }; switch ( ch ) { - case '&': ost << "&"; break; - case '<': ost << "<"; break; - case '>': ost << ">"; break; - case '\n': ost << "\n"; - //lcnt = 0; + case '&': + result.insert(result.end(), encodedChars[0], encodedChars[0]+5); break; - default: ost << ch; + case '<': + result.insert(result.end(), encodedChars[1], encodedChars[1]+4); + break; + case '>': + result.insert(result.end(), encodedChars[2], encodedChars[2]+4); + break; + case '\n': + result.push_back('\n'); + break; + case '\r': break; // Ignore \r + default: + result.push_back(ch); } - //lcnt ++; } - //if ( lcnt > 120 ) - // { - // ost << "\n"; - // lcnt = 0; - // } } - return ost.str(); + return std::string(&*result.begin(), result.size()); } //---------------------------------------------------------------------- @@ -473,49 +475,56 @@ bool cmCTest::UpdateCTestConfiguration() } if ( !cmSystemTools::FileExists(fileName.c_str()) ) { - cmCTestLog(this, ERROR_MESSAGE, "Cannot find file: " << fileName.c_str() << std::endl); - return false; - } - // parse the dart test file - std::ifstream fin(fileName.c_str()); - if(!fin) - { - return false; - } - - char buffer[1024]; - while ( fin ) - { - buffer[0] = 0; - fin.getline(buffer, 1023); - buffer[1023] = 0; - std::string line = cmCTest::CleanString(buffer); - if(line.size() == 0) + // No need to exit if we are not producing XML + if ( m_ProduceXML ) { - continue; + cmCTestLog(this, ERROR_MESSAGE, "Cannot find file: " << fileName.c_str() << std::endl); + return false; } - while ( fin && (line[line.size()-1] == '\\') ) + } + else + { + // parse the dart test file + std::ifstream fin(fileName.c_str()); + if(!fin) + { + return false; + } + + char buffer[1024]; + while ( fin ) { - line = line.substr(0, line.size()-1); buffer[0] = 0; fin.getline(buffer, 1023); buffer[1023] = 0; - line += cmCTest::CleanString(buffer); + std::string line = cmCTest::CleanString(buffer); + if(line.size() == 0) + { + continue; + } + while ( fin && (line[line.size()-1] == '\\') ) + { + line = line.substr(0, line.size()-1); + buffer[0] = 0; + fin.getline(buffer, 1023); + buffer[1023] = 0; + line += cmCTest::CleanString(buffer); + } + if ( line[0] == '#' ) + { + continue; + } + std::string::size_type cpos = line.find_first_of(":"); + if ( cpos == line.npos ) + { + continue; + } + std::string key = line.substr(0, cpos); + std::string value = cmCTest::CleanString(line.substr(cpos+1, line.npos)); + m_CTestConfiguration[key] = value; } - if ( line[0] == '#' ) - { - continue; - } - std::string::size_type cpos = line.find_first_of(":"); - if ( cpos == line.npos ) - { - continue; - } - std::string key = line.substr(0, cpos); - std::string value = cmCTest::CleanString(line.substr(cpos+1, line.npos)); - m_CTestConfiguration[key] = value; + fin.close(); } - fin.close(); if ( m_ProduceXML ) { m_TimeOut = atoi(m_CTestConfiguration["TimeOut"].c_str()); @@ -1699,7 +1708,6 @@ int cmCTest::ReadCustomConfigurationFileTree(const char* dir) { tm_VectorOfStrings dirs; tm_VectorOfStrings ndirs; - dirs.push_back(dir); cmake cm; cmGlobalGenerator gg; gg.SetCMakeInstance(&cm); @@ -1707,20 +1715,22 @@ int cmCTest::ReadCustomConfigurationFileTree(const char* dir) lg->SetGlobalGenerator(&gg); cmMakefile *mf = lg->GetMakefile(); - while ( dirs.size() > 0 ) + std::string rexpr = dir; + rexpr += "/*/CTestCustom.ctest"; + cmGlob gl; + gl.RecurseOn(); + gl.FindFiles(rexpr); + std::vector& files = gl.GetFiles(); + std::vector::iterator fileIt; + for ( fileIt = files.begin(); fileIt != files.end(); + ++ fileIt ) { - tm_VectorOfStrings::iterator cdir = dirs.end()-1; - std::string rexpr = *cdir + "/*"; - std::string fname = *cdir + "/CTestCustom.ctest"; - if ( cmSystemTools::FileExists(fname.c_str()) && - (!lg->GetMakefile()->ReadListFile(0, fname.c_str()) || - cmSystemTools::GetErrorOccuredFlag() ) ) + cmCTestLog(this, DEBUG, "* Read custom CTest configuration file: " << fileIt->c_str() << std::endl); + if ( !lg->GetMakefile()->ReadListFile(0, fileIt->c_str()) || + cmSystemTools::GetErrorOccuredFlag() ) { - cmCTestLog(this, ERROR_MESSAGE, "Problem reading custom configuration" << std::endl); + cmCTestLog(this, ERROR_MESSAGE, "Problem reading custom configuration: " << fileIt->c_str() << std::endl); } - dirs.erase(dirs.end()-1, dirs.end()); - cmSystemTools::SimpleGlob(rexpr, ndirs, -1); - dirs.insert(dirs.end(), ndirs.begin(), ndirs.end()); } cmCTest::t_TestingHandlers::iterator it;