1 /*=========================================================================
3 Program: CMake - Cross-Platform Makefile Generator
4 Module: $RCSfile: cmWhileCommand.cxx,v $
6 Date: $Date: 2008-06-28 15:16:36 $
7 Version: $Revision: 1.13 $
9 Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
10 See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
12 This software is distributed WITHOUT ANY WARRANTY; without even
13 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 PURPOSE. See the above copyright notices for more information.
16 =========================================================================*/
17 #include "cmWhileCommand.h"
18 #include "cmIfCommand.h"
20 bool cmWhileFunctionBlocker::
21 IsFunctionBlocked(const cmListFileFunction
& lff
, cmMakefile
&mf
,
22 cmExecutionStatus
&inStatus
)
24 // Prevent recusion and don't let this blocker block its own
31 // at end of for each execute recorded commands
32 if (!cmSystemTools::Strucmp(lff
.Name
.c_str(),"while"))
34 // record the number of while commands past this one
37 else if (!cmSystemTools::Strucmp(lff
.Name
.c_str(),"endwhile"))
39 // if this is the endwhile for this while loop then execute
42 std::string errorString
;
44 std::vector
<std::string
> expandedArguments
;
45 mf
.ExpandArguments(this->Args
, expandedArguments
);
47 cmIfCommand::IsTrue(expandedArguments
,errorString
,&mf
);
49 this->Executing
= true;
52 // Invoke all the functions that were collected in the block.
53 for(unsigned int c
= 0; c
< this->Functions
.size(); ++c
)
55 cmExecutionStatus status
;
56 mf
.ExecuteCommand(this->Functions
[c
],status
);
57 if (status
.GetReturnInvoked())
59 inStatus
.SetReturnInvoked(true);
60 mf
.RemoveFunctionBlocker(lff
);
63 if (status
.GetBreakInvoked())
65 mf
.RemoveFunctionBlocker(lff
);
69 expandedArguments
.clear();
70 mf
.ExpandArguments(this->Args
, expandedArguments
);
72 cmIfCommand::IsTrue(expandedArguments
,errorString
,&mf
);
74 mf
.RemoveFunctionBlocker(lff
);
79 // decrement for each nested while that ends
85 this->Functions
.push_back(lff
);
91 bool cmWhileFunctionBlocker::
92 ShouldRemove(const cmListFileFunction
& lff
, cmMakefile
& )
94 if(!cmSystemTools::Strucmp(lff
.Name
.c_str(),"endwhile"))
96 // if the endwhile has arguments, then make sure
97 // they match the arguments of the matching while
98 if (lff
.Arguments
.size() == 0 ||
99 lff
.Arguments
== this->Args
)
107 void cmWhileFunctionBlocker::
108 ScopeEnded(cmMakefile
&mf
)
110 cmSystemTools::Error(
111 "The end of a CMakeLists file was reached with a WHILE statement that "
112 "was not closed properly. Within the directory: ",
113 mf
.GetCurrentDirectory());
117 ::InvokeInitialPass(const std::vector
<cmListFileArgument
>& args
,
122 this->SetError("called with incorrect number of arguments");
126 // create a function blocker
127 cmWhileFunctionBlocker
*f
= new cmWhileFunctionBlocker();
129 this->Makefile
->AddFunctionBlocker(f
);