summaryrefslogtreecommitdiffstats
path: root/Source/cmCableDefineSetCommand.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmCableDefineSetCommand.cxx')
-rw-r--r--Source/cmCableDefineSetCommand.cxx323
1 files changed, 0 insertions, 323 deletions
diff --git a/Source/cmCableDefineSetCommand.cxx b/Source/cmCableDefineSetCommand.cxx
deleted file mode 100644
index 3469cd8..0000000
--- a/Source/cmCableDefineSetCommand.cxx
+++ /dev/null
@@ -1,323 +0,0 @@
-/*=========================================================================
-
- Program: Insight Segmentation & Registration Toolkit
- Module: $RCSfile$
- Language: C++
- Date: $Date$
- Version: $Revision$
-
-Copyright (c) 2001 Insight Consortium
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- * The name of the Insight Consortium, nor the names of any consortium members,
- nor of any contributors, may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- * Modified source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-=========================================================================*/
-#include "cmCableDefineSetCommand.h"
-#include "cmCacheManager.h"
-
-#include "cmRegularExpression.h"
-
-
-// cmCableDefineSetCommand
-bool cmCableDefineSetCommand::InitialPass(std::vector<std::string>& args)
-{
- if(args.size() < 2)
- {
- this->SetError("called with incorrect number of arguments");
- return false;
- }
-
- // This command needs access to the Cable data.
- this->SetupCableData();
-
- std::vector<std::string>::const_iterator arg = args.begin();
-
- // The first argument is the name of the set.
- m_SetName = *arg++;
-
- // All arguments until a "SOURCE_FILES" are the elements to be placed in
- // the set.
- for(; (arg != args.end()) && (*arg != "SOURCE_FILES"); ++arg)
- {
- // If the element cannot be added, return an error.
- // This can occur when a tag is not specified and can't be generated.
- if(!this->AddElement(*arg))
- { return false; }
- }
-
- // If we are not at the end, the "SOURCE_FILES" keyword has been
- // encountered.
- if(arg != args.end())
- {
- // The rest of the arguments are source files to be included in
- // any package which references the set.
- for(++arg; arg != args.end(); ++arg)
- {
- if(!this->AddSourceFile(*arg))
- { return false; }
- }
- }
-
- // Write this command's configuration output.
- this->WriteConfiguration();
-
- return true;
-}
-
-
-/**
- * Write the CABLE configuration code to define this Set.
- */
-void cmCableDefineSetCommand::WriteConfiguration() const
-{
- cmRegularExpression needCdataBlock("[&<>]");
-
- // Get the ouptut information from the cmCableData.
- std::ostream& os = m_CableData->GetOutputStream();
- cmCableData::Indentation indent = m_CableData->GetIndentation();
-
- // Output the code.
- os << indent << "<" << this->GetXmlTag() << " name=\"" << m_SetName.c_str() << "\">" << std::endl;
- for(std::vector<std::string>::const_iterator e = m_SourceHeaders.begin();
- e != m_SourceHeaders.end(); ++e)
- {
- os << indent << " <File name=\"" << e->c_str() << "\"/>" << std::endl;
- }
- for(std::vector<std::string>::const_iterator e = m_InstantiationSources.begin();
- e != m_InstantiationSources.end(); ++e)
- {
- os << indent << " <File name=\"" << e->c_str()
- << "\" purpose=\"instantiate\"/>" << std::endl;
- }
- for(Elements::const_iterator e = m_Elements.begin();
- e != m_Elements.end(); ++e)
- {
- os << indent << " <Element";
- // Only output the tag if it is not the empty string.
- if(e->first.length() > 0)
- {
- os << " tag=\"" << e->first.c_str() << "\"";
- }
- os << ">";
- if(needCdataBlock.find(e->second.c_str()))
- {
- os << "<![CDATA[" << e->second.c_str() << "]]>";
- }
- else
- {
- os << e->second.c_str();
- }
- os << "</Element>" << std::endl;
- }
- os << indent << "</" << this->GetXmlTag() << ">" << std::endl;
-}
-
-
-/**
- * Add an element to the set. The given string is the argument to the
- * command describing the element. There are two formats allowed:
- * "code" = The code describing the element to CABLE is simply given.
- * The GenerateTag() method will guess at a good tag for the
- * code.
- * "tag:code" = The left side of a single colon is text describing the tag.
- * GenerateTag() will not be called.
- */
-bool cmCableDefineSetCommand::AddElement(const std::string& arg)
-{
- // A regular expression to match the tagged element specification.
- cmRegularExpression tagGiven("^([A-Za-z_0-9]*)[ \t]*:[ \t]*([^:].*|::.*)$");
-
- std::string tag;
- std::string code;
-
- if(tagGiven.find(arg.c_str()))
- {
- // A tag was given. Use it.
- tag = tagGiven.match(1);
- code = tagGiven.match(2);
- }
- else
- {
- // No tag was given. Try to generate one.
- if(!this->GenerateTag(arg, tag))
- { return false; }
- code = arg;
- }
-
- // Add an element with the given tag and code.
- m_Elements.push_back(Element(tag, code));
- return true;
-}
-
-
-/**
- * Given the string representing a set element, automatically generate
- * the CABLE element tag for it.
- *
- * **This function determines how the output language of all
- * CABLE-generated wrappers will look!**
- */
-bool
-cmCableDefineSetCommand::GenerateTag(const std::string& element,
- std::string& tag)
-{
- // Hold the regular expressions for matching against the element.
- cmRegularExpression regex;
-
- // If the element's code begins in a $, it is referring to a set name.
- // The set's elements have their own tags, so we don't need one.
- regex.compile("^[ \t]*\\$");
- if(regex.find(element))
- { tag = ""; return true; }
-
- // Test for simple integer
- regex.compile("^[ \t]*([0-9]*)[ \t]*$");
- if(regex.find(element))
- {
- tag = "_";
- tag.append(regex.match(1));
- return true;
- }
-
- // Test for basic integer type
- regex.compile("^[ \t]*(unsigned[ ]|signed[ ])?[ \t]*(char|short|int|long|long[ ]long)[ \t]*$");
- if(regex.find(element))
- {
- tag = "_";
- if(regex.match(1) == "unsigned ")
- { tag.append("u"); }
- if(regex.match(2) == "long long")
- { tag.append("llong"); }
- else
- { tag.append(regex.match(2)); }
- return true;
- }
-
- // Test for basic floating-point type
- regex.compile("^[ \t]*(long[ ]|)[ \t]*(float|double)[ \t]*$");
- if(regex.find(element))
- {
- tag = "_";
- if(regex.match(1) == "long ")
- tag.append("l");
- tag.append(regex.match(2));
- return true;
- }
-
- // Test for basic wide-character type
- regex.compile("^[ \t]*(wchar_t)[ \t]*$");
- if(regex.find(element))
- {
- tag = "_wchar";
- return true;
- }
-
- // Test for plain type name (without template arguments).
- regex.compile("^[ \t]*([A-Za-z_][A-Za-z0-9_]*)[ \t]*$");
- if(regex.find(element))
- {
- // The tag is the same as the type.
- tag = regex.match(1);
- return true;
- }
-
- // Test for template class instance.
- regex.compile("^[ \t]*([A-Za-z_][A-Za-z0-9_]*)<.*[ \t]*$");
- if(regex.find(element))
- {
- // The tag is the type without arguments (the arguments may have
- // their own tags).
- tag = regex.match(1);
- return true;
- }
-
- // We can't generate a tag.
- std::string err =
- ("doesn't know how to generate tag for element \""+element+"\" in set \""
- +m_SetName+"\"\nPlease specify one with the \"tag:element\" syntax.");
- this->SetError(err.c_str());
-
- tag = "";
-
- return false;
-}
-
-
-/**
- * Add a source file associated with this set. Any package referencing
- * this set will automatically include this source file.
- */
-bool cmCableDefineSetCommand::AddSourceFile(const std::string& file)
-{
- // We must locate the file in the include path so that we can detect
- // its extension, and whether there is more than one to find.
- std::string header = file+".h";
- std::string txx = file+".txx";
- m_Makefile->ExpandVariablesInString(header);
- m_Makefile->ExpandVariablesInString(txx);
-
- // See if the file just exists here. The compiler's search path will
- // locate it.
- if(cmSystemTools::FileExists(header.c_str()))
- {
- m_SourceHeaders.push_back(header);
- // See if there is a matching .txx as well.
- if(cmSystemTools::FileExists(txx.c_str()))
- {
- m_InstantiationSources.push_back(txx);
- }
- return true;
- }
-
- // We must look for the file in the include search path.
- const std::vector<std::string>& includeDirectories =
- m_Makefile->GetIncludeDirectories();
-
- for(std::vector<std::string>::const_iterator dir = includeDirectories.begin();
- dir != includeDirectories.end(); ++dir)
- {
- std::string path = *dir + "/";
- m_Makefile->ExpandVariablesInString(path);
- if(cmSystemTools::FileExists((path+header).c_str()))
- {
- m_SourceHeaders.push_back(header);
- // See if there is a matching .txx as well.
- if(cmSystemTools::FileExists((path+txx).c_str()))
- {
- m_InstantiationSources.push_back(txx);
- }
- return true;
- }
- }
-
- // We couldn't locate the source file. Report the error.
- std::string err = "couldn't find source file " + header;
- this->SetError(err.c_str());
- return false;
-}