summaryrefslogtreecommitdiffstats
path: root/Source/cmForEachCommand.cxx
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2004-04-29 19:12:40 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2004-04-29 19:12:40 (GMT)
commit8750f1c277d8bf3fdf2d2986f473c5f09e293ea5 (patch)
treec5db04b06c7c9ae256b6404fab2b664edb1ad5dd /Source/cmForEachCommand.cxx
parentae50b4bc6afa62663317e630aef509a29c4f9021 (diff)
downloadCMake-8750f1c277d8bf3fdf2d2986f473c5f09e293ea5.zip
CMake-8750f1c277d8bf3fdf2d2986f473c5f09e293ea5.tar.gz
CMake-8750f1c277d8bf3fdf2d2986f473c5f09e293ea5.tar.bz2
ENH: Add RANGE support to FOREACH
Diffstat (limited to 'Source/cmForEachCommand.cxx')
-rw-r--r--Source/cmForEachCommand.cxx74
1 files changed, 73 insertions, 1 deletions
diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx
index cd6e1e2..24f17fa 100644
--- a/Source/cmForEachCommand.cxx
+++ b/Source/cmForEachCommand.cxx
@@ -106,7 +106,79 @@ bool cmForEachCommand::InitialPass(std::vector<std::string> const& args)
// create a function blocker
cmForEachFunctionBlocker *f = new cmForEachFunctionBlocker();
- f->m_Args = args;
+ if ( args.size() > 1 )
+ {
+ if ( args[1] == "RANGE" )
+ {
+ int start = 0;
+ int stop = 0;
+ int step = 0;
+ if ( args.size() == 3 )
+ {
+ stop = atoi(args[2].c_str());
+ }
+ if ( args.size() == 4 )
+ {
+ start = atoi(args[2].c_str());
+ stop = atoi(args[3].c_str());
+ }
+ 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 )
+ {
+ step = -1;
+ }
+ else
+ {
+ step = 1;
+ }
+ }
+ if (
+ (start > stop && step > 0) ||
+ (start < stop && step < 0) ||
+ step == 0
+ )
+ {
+ cmOStringStream str;
+ str << "called with incorrect range specification: start ";
+ str << start << ", stop " << stop << ", step " << step;
+ this->SetError(str.str().c_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) )
+ {
+ break;
+ }
+ sprintf(buffer, "%d", cc);
+ range.push_back(buffer);
+ if ( cc == stop )
+ {
+ break;
+ }
+ }
+ f->m_Args = range;
+ }
+ else
+ {
+ f->m_Args = args;
+ }
+ }
+ else
+ {
+ f->m_Args = args;
+ }
m_Makefile->AddFunctionBlocker(f);
return true;