ENH: also store the group matches from IF( MATCHES) in CMAKE_MATCH_(0..9)

Alex
This commit is contained in:
Alexander Neundorf 2007-08-29 11:58:38 -04:00
parent fb43c64476
commit e80acd971c
4 changed files with 19 additions and 14 deletions

View File

@ -15,6 +15,8 @@
=========================================================================*/ =========================================================================*/
#include "cmIfCommand.h" #include "cmIfCommand.h"
#include "cmStringCommand.h"
#include <stdlib.h> // required for atof #include <stdlib.h> // required for atof
#include <list> #include <list>
#include <cmsys/RegularExpression.hxx> #include <cmsys/RegularExpression.hxx>
@ -215,7 +217,7 @@ namespace
bool cmIfCommand::IsTrue(const std::vector<std::string> &args, bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
char **errorString, const cmMakefile *makefile) char **errorString, cmMakefile *makefile)
{ {
// check for the different signatures // check for the different signatures
const char *def; const char *def;
@ -369,6 +371,7 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
{ {
def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile); def = cmIfCommand::GetVariableOrString(arg->c_str(), makefile);
const char* rex = (argP2)->c_str(); const char* rex = (argP2)->c_str();
cmStringCommand::ClearMatches(makefile);
cmsys::RegularExpression regEntry; cmsys::RegularExpression regEntry;
if ( !regEntry.compile(rex) ) if ( !regEntry.compile(rex) )
{ {
@ -382,6 +385,7 @@ bool cmIfCommand::IsTrue(const std::vector<std::string> &args,
if (regEntry.find(def)) if (regEntry.find(def))
{ {
*arg = "1"; *arg = "1";
cmStringCommand::StoreMatches(makefile, regEntry);
} }
else else
{ {

View File

@ -174,7 +174,7 @@ public:
// arguments were valid, and if so, was the response true. If there is // arguments were valid, and if so, was the response true. If there is
// an error, the errorString will be set. // an error, the errorString will be set.
static bool IsTrue(const std::vector<std::string> &args, static bool IsTrue(const std::vector<std::string> &args,
char** errorString, const cmMakefile *mf); char** errorString, cmMakefile *mf);
// Get a definition from the makefile. If it doesn't exist, // Get a definition from the makefile. If it doesn't exist,
// return the original string. // return the original string.

View File

@ -248,7 +248,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args)
input += args[i]; input += args[i];
} }
this->ClearMatches(); this->ClearMatches(this->Makefile);
// Compile the regular expression. // Compile the regular expression.
cmsys::RegularExpression re; cmsys::RegularExpression re;
if(!re.compile(regex.c_str())) if(!re.compile(regex.c_str()))
@ -263,7 +263,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args)
std::string output; std::string output;
if(re.find(input.c_str())) if(re.find(input.c_str()))
{ {
this->StoreMatches(re); this->StoreMatches(this->Makefile, re);
std::string::size_type l = re.start(); std::string::size_type l = re.start();
std::string::size_type r = re.end(); std::string::size_type r = re.end();
if(r-l == 0) if(r-l == 0)
@ -297,7 +297,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args)
input += args[i]; input += args[i];
} }
this->ClearMatches(); this->ClearMatches(this->Makefile);
// Compile the regular expression. // Compile the regular expression.
cmsys::RegularExpression re; cmsys::RegularExpression re;
if(!re.compile(regex.c_str())) if(!re.compile(regex.c_str()))
@ -314,7 +314,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args)
const char* p = input.c_str(); const char* p = input.c_str();
while(re.find(p)) while(re.find(p))
{ {
this->StoreMatches(re); this->StoreMatches(this->Makefile, re);
std::string::size_type l = re.start(); std::string::size_type l = re.start();
std::string::size_type r = re.end(); std::string::size_type r = re.end();
if(r-l == 0) if(r-l == 0)
@ -401,7 +401,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
input += args[i]; input += args[i];
} }
this->ClearMatches(); this->ClearMatches(this->Makefile);
// Compile the regular expression. // Compile the regular expression.
cmsys::RegularExpression re; cmsys::RegularExpression re;
if(!re.compile(regex.c_str())) if(!re.compile(regex.c_str()))
@ -418,7 +418,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
std::string::size_type base = 0; std::string::size_type base = 0;
while(re.find(input.c_str()+base)) while(re.find(input.c_str()+base))
{ {
this->StoreMatches(re); this->StoreMatches(this->Makefile, re);
std::string::size_type l2 = re.start(); std::string::size_type l2 = re.start();
std::string::size_type r = re.end(); std::string::size_type r = re.end();
@ -479,24 +479,24 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args)
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmStringCommand::ClearMatches() void cmStringCommand::ClearMatches(cmMakefile* mf)
{ {
for (unsigned int i=0; i<10; i++) for (unsigned int i=0; i<10; i++)
{ {
char name[128]; char name[128];
sprintf(name, "CMAKE_MATCH_%d", i); sprintf(name, "CMAKE_MATCH_%d", i);
this->Makefile->AddDefinition(name, ""); mf->AddDefinition(name, "");
} }
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmStringCommand::StoreMatches(cmsys::RegularExpression& re) void cmStringCommand::StoreMatches(cmMakefile* mf,cmsys::RegularExpression& re)
{ {
for (unsigned int i=0; i<10; i++) for (unsigned int i=0; i<10; i++)
{ {
char name[128]; char name[128];
sprintf(name, "CMAKE_MATCH_%d", i); sprintf(name, "CMAKE_MATCH_%d", i);
this->Makefile->AddDefinition(name, re.match(i).c_str()); mf->AddDefinition(name, re.match(i).c_str());
} }
} }

View File

@ -19,6 +19,7 @@
#include "cmCommand.h" #include "cmCommand.h"
class cmMakefile;
namespace cmsys namespace cmsys
{ {
class RegularExpression; class RegularExpression;
@ -122,6 +123,8 @@ public:
} }
cmTypeMacro(cmStringCommand, cmCommand); cmTypeMacro(cmStringCommand, cmCommand);
static void ClearMatches(cmMakefile* mf);
static void StoreMatches(cmMakefile* mf, cmsys::RegularExpression& re);
protected: protected:
bool HandleConfigureCommand(std::vector<std::string> const& args); bool HandleConfigureCommand(std::vector<std::string> const& args);
bool HandleAsciiCommand(std::vector<std::string> const& args); bool HandleAsciiCommand(std::vector<std::string> const& args);
@ -137,8 +140,6 @@ protected:
bool HandleSubstringCommand(std::vector<std::string> const& args); bool HandleSubstringCommand(std::vector<std::string> const& args);
bool HandleStripCommand(std::vector<std::string> const& args); bool HandleStripCommand(std::vector<std::string> const& args);
bool HandleRandomCommand(std::vector<std::string> const& args); bool HandleRandomCommand(std::vector<std::string> const& args);
void ClearMatches();
void StoreMatches(cmsys::RegularExpression& re);
class RegexReplacement class RegexReplacement
{ {