diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-04-29 19:12:40 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2004-04-29 19:12:40 (GMT) |
commit | 8750f1c277d8bf3fdf2d2986f473c5f09e293ea5 (patch) | |
tree | c5db04b06c7c9ae256b6404fab2b664edb1ad5dd /Source/cmForEachCommand.cxx | |
parent | ae50b4bc6afa62663317e630aef509a29c4f9021 (diff) | |
download | CMake-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.cxx | 74 |
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; |