summaryrefslogtreecommitdiff
path: root/Source/cmForEachCommand.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmForEachCommand.cxx')
-rw-r--r--Source/cmForEachCommand.cxx255
1 files changed, 114 insertions, 141 deletions
diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx
index d69706730..8346b2309 100644
--- a/Source/cmForEachCommand.cxx
+++ b/Source/cmForEachCommand.cxx
@@ -1,88 +1,89 @@
-/*============================================================================
- 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 "cmForEachCommand.h"
- Distributed under the OSI-approved BSD License (the "License");
- see accompanying file Copyright.txt for details.
+#include <sstream>
+#include <stdio.h>
+#include <stdlib.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 "cmForEachCommand.h"
+#include "cmExecutionStatus.h"
+#include "cmMakefile.h"
+#include "cmSystemTools.h"
+#include "cm_auto_ptr.hxx"
+#include "cmake.h"
+
+cmForEachFunctionBlocker::cmForEachFunctionBlocker(cmMakefile* mf)
+ : Makefile(mf)
+ , Depth(0)
+{
+ this->Makefile->PushLoopBlock();
+}
-#include <cmsys/auto_ptr.hxx>
+cmForEachFunctionBlocker::~cmForEachFunctionBlocker()
+{
+ this->Makefile->PopLoopBlock();
+}
-bool cmForEachFunctionBlocker::
-IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
- cmExecutionStatus &inStatus)
+bool cmForEachFunctionBlocker::IsFunctionBlocked(const cmListFileFunction& lff,
+ cmMakefile& mf,
+ cmExecutionStatus& inStatus)
{
- if (!cmSystemTools::Strucmp(lff.Name.c_str(),"foreach"))
- {
+ if (!cmSystemTools::Strucmp(lff.Name.c_str(), "foreach")) {
// record the number of nested foreach commands
this->Depth++;
- }
- else if (!cmSystemTools::Strucmp(lff.Name.c_str(),"endforeach"))
- {
+ } else if (!cmSystemTools::Strucmp(lff.Name.c_str(), "endforeach")) {
// if this is the endofreach for this statement
- 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;
+ }
// at end of for each execute recorded commands
// store the old value
std::string oldDef;
- if (mf.GetDefinition(this->Args[0].c_str()))
- {
- oldDef = mf.GetDefinition(this->Args[0].c_str());
- }
+ if (mf.GetDefinition(this->Args[0])) {
+ oldDef = mf.GetDefinition(this->Args[0]);
+ }
std::vector<std::string>::const_iterator j = this->Args.begin();
++j;
- std::string tmps;
- cmListFileArgument arg;
- for( ; j != this->Args.end(); ++j)
- {
+ for (; j != this->Args.end(); ++j) {
// set the variable to the loop value
- mf.AddDefinition(this->Args[0].c_str(),j->c_str());
+ mf.AddDefinition(this->Args[0], j->c_str());
// Invoke all the functions that were collected in the block.
cmExecutionStatus status;
- for(unsigned int c = 0; c < this->Functions.size(); ++c)
- {
+ for (unsigned int c = 0; c < this->Functions.size(); ++c) {
status.Clear();
- mf.ExecuteCommand(this->Functions[c],status);
- if (status.GetReturnInvoked())
- {
- inStatus.SetReturnInvoked(true);
+ mf.ExecuteCommand(this->Functions[c], status);
+ if (status.GetReturnInvoked()) {
+ inStatus.SetReturnInvoked();
// restore the variable to its prior value
- mf.AddDefinition(this->Args[0].c_str(),oldDef.c_str());
+ mf.AddDefinition(this->Args[0], oldDef.c_str());
return true;
- }
- if (status.GetBreakInvoked())
- {
+ }
+ if (status.GetBreakInvoked()) {
// restore the variable to its prior value
- mf.AddDefinition(this->Args[0].c_str(),oldDef.c_str());
+ mf.AddDefinition(this->Args[0], oldDef.c_str());
return true;
- }
- if(cmSystemTools::GetFatalErrorOccured() )
- {
+ }
+ if (status.GetContinueInvoked()) {
+ break;
+ }
+ if (cmSystemTools::GetFatalErrorOccured()) {
return true;
- }
}
}
+ }
+
// restore the variable to its prior value
- mf.AddDefinition(this->Args[0].c_str(),oldDef.c_str());
+ mf.AddDefinition(this->Args[0], oldDef.c_str());
return true;
- }
- else
- {
- // close out a nested foreach
- this->Depth--;
- }
}
+ // close out a nested foreach
+ this->Depth--;
+ }
// record the command
this->Functions.push_back(lff);
@@ -91,156 +92,128 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
return true;
}
-bool cmForEachFunctionBlocker::
-ShouldRemove(const cmListFileFunction& lff, cmMakefile& mf)
+bool cmForEachFunctionBlocker::ShouldRemove(const cmListFileFunction& lff,
+ cmMakefile& mf)
{
- if(!cmSystemTools::Strucmp(lff.Name.c_str(),"endforeach"))
- {
+ if (!cmSystemTools::Strucmp(lff.Name.c_str(), "endforeach")) {
std::vector<std::string> expandedArguments;
mf.ExpandArguments(lff.Arguments, expandedArguments);
// if the endforeach has arguments then make sure
// they match the begin foreach arguments
if ((expandedArguments.empty() ||
- (expandedArguments[0] == this->Args[0])))
- {
+ (expandedArguments[0] == this->Args[0]))) {
return true;
- }
}
+ }
return false;
}
-bool cmForEachCommand
-::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
+bool cmForEachCommand::InitialPass(std::vector<std::string> const& args,
+ cmExecutionStatus&)
{
- if(args.size() < 1)
- {
+ if (args.empty()) {
this->SetError("called with incorrect number of arguments");
return false;
- }
- if(args.size() > 1 && args[1] == "IN")
- {
+ }
+ if (args.size() > 1 && args[1] == "IN") {
return this->HandleInMode(args);
- }
+ }
// create a function blocker
- cmForEachFunctionBlocker *f = new cmForEachFunctionBlocker();
- if ( args.size() > 1 )
- {
- if ( args[1] == "RANGE" )
- {
+ cmForEachFunctionBlocker* f = new cmForEachFunctionBlocker(this->Makefile);
+ if (args.size() > 1) {
+ if (args[1] == "RANGE") {
int start = 0;
int stop = 0;
int step = 0;
- if ( args.size() == 3 )
- {
+ if (args.size() == 3) {
stop = atoi(args[2].c_str());
- }
- if ( args.size() == 4 )
- {
+ }
+ if (args.size() == 4) {
start = atoi(args[2].c_str());
stop = atoi(args[3].c_str());
- }
- if ( args.size() == 5 )
- {
+ }
+ if (args.size() == 5) {
start = atoi(args[2].c_str());
stop = atoi(args[3].c_str());
step = atoi(args[4].c_str());
- }
- if ( step == 0 )
- {
- if ( start > stop )
- {
+ }
+ if (step == 0) {
+ if (start > stop) {
step = -1;
- }
- else
- {
+ } else {
step = 1;
- }
}
- if (
- (start > stop && step > 0) ||
- (start < stop && step < 0) ||
- step == 0
- )
- {
- cmOStringStream str;
+ }
+ if ((start > stop && step > 0) || (start < stop && step < 0) ||
+ step == 0) {
+ std::ostringstream str;
str << "called with incorrect range specification: start ";
str << start << ", stop " << stop << ", step " << step;
- this->SetError(str.str().c_str());
+ this->SetError(str.str());
return false;
- }
+ }
std::vector<std::string> range;
char buffer[100];
range.push_back(args[0]);
int cc;
- for ( cc = start; ; cc += step )
- {
- if ( (step > 0 && cc > stop) || (step < 0 && cc < stop) )
- {
+ for (cc = start;; cc += step) {
+ if ((step > 0 && cc > stop) || (step < 0 && cc < stop)) {
break;
- }
+ }
sprintf(buffer, "%d", cc);
range.push_back(buffer);
- if ( cc == stop )
- {
+ if (cc == stop) {
break;
- }
}
- f->Args = range;
}
- else
- {
+ f->Args = range;
+ } else {
f->Args = args;
- }
}
- else
- {
+ } else {
f->Args = args;
- }
+ }
this->Makefile->AddFunctionBlocker(f);
return true;
}
-//----------------------------------------------------------------------------
bool cmForEachCommand::HandleInMode(std::vector<std::string> const& args)
{
- cmsys::auto_ptr<cmForEachFunctionBlocker> f(new cmForEachFunctionBlocker());
+ CM_AUTO_PTR<cmForEachFunctionBlocker> f(
+ new cmForEachFunctionBlocker(this->Makefile));
f->Args.push_back(args[0]);
- enum Doing { DoingNone, DoingLists, DoingItems };
+ enum Doing
+ {
+ DoingNone,
+ DoingLists,
+ DoingItems
+ };
Doing doing = DoingNone;
- for(unsigned int i=2; i < args.size(); ++i)
- {
- if(doing == DoingItems)
- {
+ for (unsigned int i = 2; i < args.size(); ++i) {
+ if (doing == DoingItems) {
f->Args.push_back(args[i]);
- }
- else if(args[i] == "LISTS")
- {
+ } else if (args[i] == "LISTS") {
doing = DoingLists;
- }
- else if(args[i] == "ITEMS")
- {
+ } else if (args[i] == "ITEMS") {
doing = DoingItems;
- }
- else if(doing == DoingLists)
- {
- const char* value = this->Makefile->GetDefinition(args[i].c_str());
- if(value && *value)
- {
+ } else if (doing == DoingLists) {
+ const char* value = this->Makefile->GetDefinition(args[i]);
+ if (value && *value) {
cmSystemTools::ExpandListArgument(value, f->Args, true);
- }
}
- else
- {
- cmOStringStream e;
- e << "Unknown argument:\n" << " " << args[i] << "\n";
+ } else {
+ std::ostringstream e;
+ e << "Unknown argument:\n"
+ << " " << args[i] << "\n";
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
return true;
- }
}
+ }
this->Makefile->AddFunctionBlocker(f.release()); // TODO: pass auto_ptr
+
return true;
}