summaryrefslogtreecommitdiffstats
path: root/Source/cmCTest.cxx
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2005-07-03 02:50:57 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2005-07-03 02:50:57 (GMT)
commitbaf5601acb6c9fcf7357d48d53e4e9f0f107bb2b (patch)
tree4731e05e943b65b9b3421b9b2c18cb1f316c177e /Source/cmCTest.cxx
parent26a70a2e37db6fb827a42b2f2d27ba3f257c3f70 (diff)
downloadCMake-baf5601acb6c9fcf7357d48d53e4e9f0f107bb2b.zip
CMake-baf5601acb6c9fcf7357d48d53e4e9f0f107bb2b.tar.gz
CMake-baf5601acb6c9fcf7357d48d53e4e9f0f107bb2b.tar.bz2
ENH: Improve performance of MakeXMLSafe, improve performance of reading custom ctest files, and remove error when running ctest on directory without DartConfiguration.tcl
Diffstat (limited to 'Source/cmCTest.cxx')
-rw-r--r--Source/cmCTest.cxx150
1 files changed, 80 insertions, 70 deletions
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index e7017c5..50234f7 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<char> 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, "&lt;%d&gt;", (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[] = {
+ "&amp;",
+ "&lt;",
+ "&gt;"
+ };
switch ( ch )
{
- case '&': ost << "&amp;"; break;
- case '<': ost << "&lt;"; break;
- case '>': ost << "&gt;"; break;
- case '\n': ost << "\n";
- //lcnt = 0;
+ case '&':
+ result.insert(result.end(), encodedChars[0], encodedChars[0]+5);
+ break;
+ 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;
- default: ost << ch;
+ 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;
+ // No need to exit if we are not producing XML
+ if ( m_ProduceXML )
+ {
+ cmCTestLog(this, ERROR_MESSAGE, "Cannot find file: " << fileName.c_str() << std::endl);
+ return false;
+ }
}
-
- char buffer[1024];
- while ( fin )
+ else
{
- buffer[0] = 0;
- fin.getline(buffer, 1023);
- buffer[1023] = 0;
- std::string line = cmCTest::CleanString(buffer);
- if(line.size() == 0)
+ // parse the dart test file
+ std::ifstream fin(fileName.c_str());
+ if(!fin)
{
- continue;
+ return false;
}
- while ( fin && (line[line.size()-1] == '\\') )
+
+ 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);
- }
- if ( line[0] == '#' )
- {
- continue;
- }
- std::string::size_type cpos = line.find_first_of(":");
- if ( cpos == line.npos )
- {
- continue;
+ 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;
}
- 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<std::string>& files = gl.GetFiles();
+ std::vector<std::string>::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;