summaryrefslogtreecommitdiff
path: root/Source/cmWhileCommand.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmWhileCommand.cxx')
-rw-r--r--Source/cmWhileCommand.cxx157
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;
}
-