summaryrefslogtreecommitdiffstats
path: root/Source/CTest/cmCTestHandlerCommand.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-01-12 14:10:47 (GMT)
committerBrad King <brad.king@kitware.com>2009-01-12 14:10:47 (GMT)
commitae2c4143d288624b6703085602ecee2289b3ee27 (patch)
tree25365a4244d6d426b65e7407e9f2161db484433d /Source/CTest/cmCTestHandlerCommand.cxx
parent02fb5880c18e95a4cd94f8fde2b3ded06c191fd5 (diff)
downloadCMake-ae2c4143d288624b6703085602ecee2289b3ee27.zip
CMake-ae2c4143d288624b6703085602ecee2289b3ee27.tar.gz
CMake-ae2c4143d288624b6703085602ecee2289b3ee27.tar.bz2
ENH: Refactor CTest command argument handling
The previous approach to handling of arguments to ctest_* commands worked only for keyword/value arguments with a single value. This refactors the approach to allow some commands to define alternative argument forms.
Diffstat (limited to 'Source/CTest/cmCTestHandlerCommand.cxx')
-rw-r--r--Source/CTest/cmCTestHandlerCommand.cxx99
1 files changed, 51 insertions, 48 deletions
diff --git a/Source/CTest/cmCTestHandlerCommand.cxx b/Source/CTest/cmCTestHandlerCommand.cxx
index dfd55e4..e4ae832 100644
--- a/Source/CTest/cmCTestHandlerCommand.cxx
+++ b/Source/CTest/cmCTestHandlerCommand.cxx
@@ -38,10 +38,29 @@ cmCTestHandlerCommand::cmCTestHandlerCommand()
bool cmCTestHandlerCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
- if ( !this->ProcessArguments(args, (unsigned int)this->Last,
- &*this->Arguments.begin(),this->Values) )
+ // Allocate space for argument values.
+ this->Values.clear();
+ this->Values.resize(this->Last, 0);
+
+ // Process input arguments.
+ this->ArgumentDoing = ArgumentDoingNone;
+ for(unsigned int i=0; i < args.size(); ++i)
{
- return false;
+ // Check this argument.
+ if(!this->CheckArgumentKeyword(args[i]) &&
+ !this->CheckArgumentValue(args[i]))
+ {
+ cmOStringStream e;
+ e << "called with unknown argument \"" << args[i] << "\".";
+ this->SetError(e.str().c_str());
+ return false;
+ }
+
+ // Quit if an argument is invalid.
+ if(this->ArgumentDoing == ArgumentDoingError)
+ {
+ return false;
+ }
}
cmCTestLog(this->CTest, DEBUG, "Initialize handler" << std::endl;);
@@ -121,57 +140,41 @@ bool cmCTestHandlerCommand
return true;
}
-bool cmCTestHandlerCommand::ProcessArguments(
- std::vector<std::string> const& args, int last, const char** strings,
- std::vector<const char*>& values)
+//----------------------------------------------------------------------------
+bool cmCTestHandlerCommand::CheckArgumentKeyword(std::string const& arg)
{
- int state = 0;
- int cc;
- values.resize(last);
- for ( cc = 0; cc < last; ++ cc )
+ // Check for a keyword in our argument/value table.
+ for(unsigned int k=0; k < this->Arguments.size(); ++k)
{
- values[cc] = 0;
+ if(this->Arguments[k] && arg == this->Arguments[k])
+ {
+ this->ArgumentDoing = ArgumentDoingKeyword;
+ this->ArgumentIndex = k;
+ return true;
+ }
}
+ return false;
+}
- for(size_t i=0; i < args.size(); ++i)
+//----------------------------------------------------------------------------
+bool cmCTestHandlerCommand::CheckArgumentValue(std::string const& arg)
+{
+ if(this->ArgumentDoing == ArgumentDoingKeyword)
{
- if ( state > 0 && state < last )
+ this->ArgumentDoing = ArgumentDoingNone;
+ unsigned int k = this->ArgumentIndex;
+ if(this->Values[k])
{
- values[state] = args[i].c_str();
- cmCTestLog(this->CTest, DEBUG, "Set " << strings[state] << " to "
- << args[i].c_str() << std::endl);
- state = 0;
- }
- else
- {
- bool found = false;
- for ( cc = 0; cc < last; ++ cc )
- {
- if ( strings[cc] && args[i] == strings[cc] )
- {
- state = cc;
- if ( values[state] )
- {
- cmOStringStream ostr;
- ostr << "called with incorrect number of arguments. "
- << strings[state] << " specified twice.";
- this->SetError(ostr.str().c_str());
- return false;
- }
- found = true;
- break;
- }
- }
- if ( !found )
- {
- cmOStringStream str;
- str
- << "called with incorrect number of arguments. Extra argument is: "
- << args[i].c_str() << ".";
- this->SetError(str.str().c_str());
- return false;
- }
+ cmOStringStream e;
+ e << "Called with more than one value for " << this->Arguments[k];
+ this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
+ this->ArgumentDoing = ArgumentDoingError;
+ return true;
}
+ this->Values[k] = arg.c_str();
+ cmCTestLog(this->CTest, DEBUG, "Set " << this->Arguments[k]
+ << " to " << arg << "\n");
+ return true;
}
- return true;
+ return false;
}