1 /*=========================================================================
3 Program: CMake - Cross-Platform Makefile Generator
4 Module: $RCSfile: cmWhileCommand.cxx,v $
6 Date: $Date: 2009-01-21 14:49:00 $
7 Version: $Revision: 1.16 $
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 // at end of for each execute recorded commands
25 if (!cmSystemTools::Strucmp(lff
.Name
.c_str(),"while"))
27 // record the number of while commands past this one
30 else if (!cmSystemTools::Strucmp(lff
.Name
.c_str(),"endwhile"))
32 // if this is the endwhile for this while loop then execute
35 // Remove the function blocker for this scope or bail.
36 cmsys::auto_ptr
<cmFunctionBlocker
>
37 fb(mf
.RemoveFunctionBlocker(this, lff
));
38 if(!fb
.get()) { return false; }
40 std::string errorString
;
42 std::vector
<std::string
> expandedArguments
;
43 mf
.ExpandArguments(this->Args
, expandedArguments
);
45 cmIfCommand::IsTrue(expandedArguments
,errorString
,&mf
);
49 // Invoke all the functions that were collected in the block.
50 for(unsigned int c
= 0; c
< this->Functions
.size(); ++c
)
52 cmExecutionStatus status
;
53 mf
.ExecuteCommand(this->Functions
[c
],status
);
54 if (status
.GetReturnInvoked())
56 inStatus
.SetReturnInvoked(true);
59 if (status
.GetBreakInvoked())
64 expandedArguments
.clear();
65 mf
.ExpandArguments(this->Args
, expandedArguments
);
67 cmIfCommand::IsTrue(expandedArguments
,errorString
,&mf
);
73 // decrement for each nested while that ends
79 this->Functions
.push_back(lff
);
85 bool cmWhileFunctionBlocker::
86 ShouldRemove(const cmListFileFunction
& lff
, cmMakefile
& )
88 if(!cmSystemTools::Strucmp(lff
.Name
.c_str(),"endwhile"))
90 // if the endwhile has arguments, then make sure
91 // they match the arguments of the matching while
92 if (lff
.Arguments
.size() == 0 ||
93 lff
.Arguments
== this->Args
)
102 ::InvokeInitialPass(const std::vector
<cmListFileArgument
>& args
,
107 this->SetError("called with incorrect number of arguments");
111 // create a function blocker
112 cmWhileFunctionBlocker
*f
= new cmWhileFunctionBlocker();
114 this->Makefile
->AddFunctionBlocker(f
);