diff options
Diffstat (limited to 'Source/cmWhileCommand.cxx')
-rw-r--r-- | Source/cmWhileCommand.cxx | 157 |
1 files changed, 79 insertions, 78 deletions
diff --git a/Source/cmWhileCommand.cxx b/Source/cmWhileCommand.cxx index 7d2eeadd6..24d7bf1bf 100644 --- a/Source/cmWhileCommand.cxx +++ b/Source/cmWhileCommand.cxx @@ -1,103 +1,110 @@ -/*============================================================================ - CMake - Cross Platform Makefile Generator - Copyright 2000-2009 Kitware, Inc., Insight Software Consortium +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#include "cmWhileCommand.h" - Distributed under the OSI-approved BSD License (the "License"); - see accompanying file Copyright.txt for details. +#include "cmConditionEvaluator.h" +#include "cmExecutionStatus.h" +#include "cmExpandedCommandArgument.h" +#include "cmMakefile.h" +#include "cmSystemTools.h" +#include "cm_auto_ptr.hxx" +#include "cmake.h" - This software is distributed WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the License for more information. -============================================================================*/ -#include "cmWhileCommand.h" -#include "cmIfCommand.h" +cmWhileFunctionBlocker::cmWhileFunctionBlocker(cmMakefile* mf) + : Makefile(mf) + , Depth(0) +{ + this->Makefile->PushLoopBlock(); +} + +cmWhileFunctionBlocker::~cmWhileFunctionBlocker() +{ + this->Makefile->PopLoopBlock(); +} -bool cmWhileFunctionBlocker:: -IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf, - cmExecutionStatus &inStatus) +bool cmWhileFunctionBlocker::IsFunctionBlocked(const cmListFileFunction& lff, + cmMakefile& mf, + cmExecutionStatus& inStatus) { // at end of for each execute recorded commands - if (!cmSystemTools::Strucmp(lff.Name.c_str(),"while")) - { + if (!cmSystemTools::Strucmp(lff.Name.c_str(), "while")) { // record the number of while commands past this one this->Depth++; - } - else if (!cmSystemTools::Strucmp(lff.Name.c_str(),"endwhile")) - { + } else if (!cmSystemTools::Strucmp(lff.Name.c_str(), "endwhile")) { // if this is the endwhile for this while loop then execute - if (!this->Depth) - { + if (!this->Depth) { // Remove the function blocker for this scope or bail. - cmsys::auto_ptr<cmFunctionBlocker> - fb(mf.RemoveFunctionBlocker(this, lff)); - if(!fb.get()) { return false; } + CM_AUTO_PTR<cmFunctionBlocker> fb(mf.RemoveFunctionBlocker(this, lff)); + if (!fb.get()) { + return false; + } std::string errorString; - std::vector<std::string> expandedArguments; + std::vector<cmExpandedCommandArgument> expandedArguments; mf.ExpandArguments(this->Args, expandedArguments); cmake::MessageType messageType; + + cmListFileContext execContext = this->GetStartingContext(); + + cmCommandContext commandContext; + commandContext.Line = execContext.Line; + commandContext.Name = execContext.Name; + + cmConditionEvaluator conditionEvaluator(mf, this->GetStartingContext(), + mf.GetBacktrace(commandContext)); + bool isTrue = - cmIfCommand::IsTrue(expandedArguments,errorString, - &mf, messageType); + conditionEvaluator.IsTrue(expandedArguments, errorString, messageType); - while (isTrue) - { - if (errorString.size()) - { + while (isTrue) { + if (!errorString.empty()) { std::string err = "had incorrect arguments: "; unsigned int i; - for(i =0; i < this->Args.size(); ++i) - { - err += (this->Args[i].Delim?"\"":""); + for (i = 0; i < this->Args.size(); ++i) { + err += (this->Args[i].Delim ? "\"" : ""); err += this->Args[i].Value; - err += (this->Args[i].Delim?"\"":""); + err += (this->Args[i].Delim ? "\"" : ""); err += " "; - } + } err += "("; err += errorString; err += ")."; mf.IssueMessage(messageType, err); - if (messageType == cmake::FATAL_ERROR) - { + if (messageType == cmake::FATAL_ERROR) { cmSystemTools::SetFatalErrorOccured(); return true; - } } + } // Invoke all the functions that were collected in the block. - for(unsigned int c = 0; c < this->Functions.size(); ++c) - { + for (unsigned int c = 0; c < this->Functions.size(); ++c) { cmExecutionStatus status; - mf.ExecuteCommand(this->Functions[c],status); - if (status.GetReturnInvoked()) - { - inStatus.SetReturnInvoked(true); + mf.ExecuteCommand(this->Functions[c], status); + if (status.GetReturnInvoked()) { + inStatus.SetReturnInvoked(); return true; - } - if (status.GetBreakInvoked()) - { + } + if (status.GetBreakInvoked()) { return true; - } - if(cmSystemTools::GetFatalErrorOccured() ) - { + } + if (status.GetContinueInvoked()) { + break; + } + if (cmSystemTools::GetFatalErrorOccured()) { return true; - } } + } expandedArguments.clear(); mf.ExpandArguments(this->Args, expandedArguments); - isTrue = - cmIfCommand::IsTrue(expandedArguments,errorString, - &mf, messageType); - } - return true; - } - else - { - // decrement for each nested while that ends - this->Depth--; + isTrue = conditionEvaluator.IsTrue(expandedArguments, errorString, + messageType); } + return true; } + // decrement for each nested while that ends + this->Depth--; + } // record the command this->Functions.push_back(lff); @@ -106,37 +113,31 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf, return true; } -bool cmWhileFunctionBlocker:: -ShouldRemove(const cmListFileFunction& lff, cmMakefile& ) +bool cmWhileFunctionBlocker::ShouldRemove(const cmListFileFunction& lff, + cmMakefile&) { - if(!cmSystemTools::Strucmp(lff.Name.c_str(),"endwhile")) - { + if (!cmSystemTools::Strucmp(lff.Name.c_str(), "endwhile")) { // if the endwhile has arguments, then make sure // they match the arguments of the matching while - if (lff.Arguments.size() == 0 || - lff.Arguments == this->Args) - { + if (lff.Arguments.empty() || lff.Arguments == this->Args) { return true; - } } + } return false; } -bool cmWhileCommand -::InvokeInitialPass(const std::vector<cmListFileArgument>& args, - cmExecutionStatus &) +bool cmWhileCommand::InvokeInitialPass( + const std::vector<cmListFileArgument>& args, cmExecutionStatus&) { - if(args.size() < 1) - { + if (args.empty()) { this->SetError("called with incorrect number of arguments"); return false; - } + } // create a function blocker - cmWhileFunctionBlocker *f = new cmWhileFunctionBlocker(); + cmWhileFunctionBlocker* f = new cmWhileFunctionBlocker(this->Makefile); f->Args = args; this->Makefile->AddFunctionBlocker(f); return true; } - |