CMake/Source/cmCableData.cxx

221 lines
4.6 KiB
C++

/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2000 National Library of Medicine
All rights reserved.
See COPYRIGHT.txt for copyright details.
=========================================================================*/
#include "cmCableData.h"
#include "cmCacheManager.h"
#include "cmCablePackageCommand.h"
/**
* The cmCableData instance is owned by one cmCableCommand, which is given
* to this constructor.
*/
cmCableData::cmCableData(const cmCableCommand* owner,
const std::string& configurationFile):
m_Owner(owner),
m_OutputFileName(configurationFile),
m_OutputFile(configurationFile.c_str()),
m_Indentation(0),
m_Package(NULL),
m_PackageNamespaceDepth(0),
m_PackageClassIndex(-1)
{
this->InitializeOutputFile();
}
/**
* Free all data that was stored here. Also close the output file.
*/
cmCableData::~cmCableData()
{
// End last package, if any.
this->EndPackage();
// Finish up the output file.
this->CloseOutputFile();
}
/**
* Write the configuration header to the output file.
*/
void cmCableData::InitializeOutputFile()
{
if(m_OutputFile)
{
this->WriteConfigurationHeader();
}
else
{
cmSystemTools::Error("Unable to open CABLE config file: ",
m_OutputFileName.c_str());
}
}
/**
* Close the configuration output file. This writes the configuration
* footer.
*/
void cmCableData::CloseOutputFile()
{
if(m_OutputFile)
{
this->WriteConfigurationFooter();
m_OutputFile.close();
}
}
/**
* Write a CABLE configuration file header.
*/
void cmCableData::WriteConfigurationHeader()
{
m_OutputFile << m_Indentation << "<?xml version=\"1.0\"?>" << std::endl
<< m_Indentation << "<CableConfiguration>" << std::endl;
this->Indent();
}
/**
* Write a CABLE configuration file footer.
*/
void cmCableData::WriteConfigurationFooter()
{
this->Unindent();
m_OutputFile << m_Indentation << "</CableConfiguration>" << std::endl;
}
/**
* Print indentation spaces.
*/
void
cmCableData::Indentation
::Print(std::ostream& os) const
{
if(m_Indent <= 0)
{ return; }
// Use blocks of 8 spaces to speed up big indents.
unsigned int blockCount = m_Indent >> 3;
unsigned int singleCount = m_Indent & 7;
while(blockCount-- > 0)
{
os << " ";
}
while(singleCount-- > 0)
{
os << " ";
}
}
/**
* Open a namespace with the given name.
*/
void cmCableData::OpenNamespace(const std::string& name)
{
m_NamespaceStack.push_back(name);
}
/**
* Close the current namespace, checking whether it has the given name.
*/
void cmCableData::CloseNamespace(const std::string& name)
{
if(m_NamespaceStack.empty())
{
cmSystemTools::Error("Unbalanced close-namespace = ", name.c_str());
return;
}
if(m_NamespaceStack.back() != name)
{
cmSystemTools::Error("Wrong name on close-namespace = ", name.c_str());
}
// If this closes the namespace where the current package was opened,
// the package must end as well.
if(m_Package && (m_PackageNamespaceDepth == m_NamespaceStack.size()))
{
this->EndPackage();
}
m_NamespaceStack.pop_back();
}
/**
* Begin a new package definition. If there is a current one, it
* will be ended.
*/
void cmCableData::BeginPackage(cmCablePackageCommand* command)
{
// Close the current package, if any.
this->EndPackage();
// Open this package.
m_Package = command;
// Write out the package's header.
m_Package->WritePackageHeader();
// Save the package's opening namespace depth for later verification
// on the end of the package.
m_PackageNamespaceDepth = m_NamespaceStack.size();
}
/**
* End a package definition.
*/
void cmCableData::EndPackage()
{
// Make sure we have an open package.
if(!m_Package)
{
return;
}
// Make sure the namespace nesting depth matches the opening depth
// of the package.
if(m_PackageNamespaceDepth != m_NamespaceStack.size())
{
cmSystemTools::Error("Package ended at different namespace depth than"
"it was created!", "");
}
// Write out the package's footer.
m_Package->WritePackageFooter();
// Done with the package.
m_Package = NULL;
}
/**
* Simplify indentation printing by allowing Indentation objects to be added
* to streams.
*/
std::ostream& operator<<(std::ostream& os,
const cmCableData::Indentation& indent)
{
indent.Print(os);
return os;
}