diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2014-03-12 18:23:12 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2014-04-29 20:00:05 (GMT) |
commit | f718b30a95e07d72a361d55b7ba495eda5d79680 (patch) | |
tree | 5f06d51f999483a1e111fa2969d7a0d125356b55 /Source | |
parent | bb1c41a085c6eb9296bf701ea7633f715a06f6e1 (diff) | |
download | CMake-f718b30a95e07d72a361d55b7ba495eda5d79680.zip CMake-f718b30a95e07d72a361d55b7ba495eda5d79680.tar.gz CMake-f718b30a95e07d72a361d55b7ba495eda5d79680.tar.bz2 |
ClearMatches: Only clear matches which were actually set
ClearMatches was clearing many variables which were never set in the
first place. Instead, store how many matches were made last time and
only clear those. It is moved to the cmMakefile class since it is a
common utility used by multiple commands.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmIfCommand.cxx | 4 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 40 | ||||
-rw-r--r-- | Source/cmMakefile.h | 5 | ||||
-rw-r--r-- | Source/cmStringCommand.cxx | 44 | ||||
-rw-r--r-- | Source/cmStringCommand.h | 2 |
5 files changed, 53 insertions, 42 deletions
diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx index 06c4b89..1141b01 100644 --- a/Source/cmIfCommand.cxx +++ b/Source/cmIfCommand.cxx @@ -595,7 +595,7 @@ namespace { def = cmIfCommand::GetVariableOrString(*arg, makefile); const char* rex = (argP2)->c_str(); - cmStringCommand::ClearMatches(makefile); + makefile->ClearMatches(); cmsys::RegularExpression regEntry; if ( !regEntry.compile(rex) ) { @@ -607,7 +607,7 @@ namespace } if (regEntry.find(def)) { - cmStringCommand::StoreMatches(makefile, regEntry); + makefile->StoreMatches(regEntry); *arg = "1"; } else diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 07cfe12..262f29d 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -148,6 +148,8 @@ cmMakefile::cmMakefile(): Internal(new Internals) this->Initialize(); this->PreOrder = false; this->GeneratingBuildSystem = false; + + this->NumLastMatches = 0; } cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals) @@ -196,6 +198,8 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals) this->CheckSystemVars = mf.CheckSystemVars; this->ListFileStack = mf.ListFileStack; this->OutputToSource = mf.OutputToSource; + + this->NumLastMatches = mf.NumLastMatches; } //---------------------------------------------------------------------------- @@ -4329,6 +4333,42 @@ std::vector<cmSourceFile*> cmMakefile::GetQtUiFilesWithOptions() const } //---------------------------------------------------------------------------- +void cmMakefile::ClearMatches() +{ + std::stringstream sstr; + for (unsigned int i=0; i<this->NumLastMatches; i++) + { + sstr.str(""); + sstr << "CMAKE_MATCH_" << i; + std::string const& name = sstr.str(); + std::string const& s = this->GetSafeDefinition(name); + if(!s.empty()) + { + this->AddDefinition(name, ""); + this->MarkVariableAsUsed(name); + } + } + this->NumLastMatches = 0; +} + +//---------------------------------------------------------------------------- +void cmMakefile::StoreMatches(cmsys::RegularExpression& re) +{ + for (unsigned int i=0; i<10; i++) + { + std::string m = re.match(i); + if(m.size() > 0) + { + char name[128]; + sprintf(name, "CMAKE_MATCH_%d", i); + this->AddDefinition(name, re.match(i).c_str()); + this->MarkVariableAsUsed(name); + this->NumLastMatches = i + 1; + } + } +} + +//---------------------------------------------------------------------------- cmPolicies::PolicyStatus cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id) const { diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 3bccb63..7d1759e 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -889,6 +889,9 @@ public: const std::string& feature, std::string *error = 0) const; + void ClearMatches(); + void StoreMatches(cmsys::RegularExpression& re); + protected: // add link libraries and directories to the target void AddGlobalLinkInformation(const std::string& name, cmTarget& target); @@ -1065,6 +1068,8 @@ private: cmSourceFile* source); std::vector<cmSourceFile*> QtUiFilesWithOptions; + + unsigned int NumLastMatches; }; //---------------------------------------------------------------------------- diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index ea762eb..65912da 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -305,7 +305,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args) input += args[i]; } - this->ClearMatches(this->Makefile); + this->Makefile->ClearMatches(); // Compile the regular expression. cmsys::RegularExpression re; if(!re.compile(regex.c_str())) @@ -320,7 +320,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args) std::string output; if(re.find(input.c_str())) { - this->StoreMatches(this->Makefile, re); + this->Makefile->StoreMatches(re); std::string::size_type l = re.start(); std::string::size_type r = re.end(); if(r-l == 0) @@ -354,7 +354,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args) input += args[i]; } - this->ClearMatches(this->Makefile); + this->Makefile->ClearMatches(); // Compile the regular expression. cmsys::RegularExpression re; if(!re.compile(regex.c_str())) @@ -371,7 +371,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args) const char* p = input.c_str(); while(re.find(p)) { - this->StoreMatches(this->Makefile, re); + this->Makefile->StoreMatches(re); std::string::size_type l = re.start(); std::string::size_type r = re.end(); if(r-l == 0) @@ -458,7 +458,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args) input += args[i]; } - this->ClearMatches(this->Makefile); + this->Makefile->ClearMatches(); // Compile the regular expression. cmsys::RegularExpression re; if(!re.compile(regex.c_str())) @@ -475,7 +475,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args) std::string::size_type base = 0; while(re.find(input.c_str()+base)) { - this->StoreMatches(this->Makefile, re); + this->Makefile->StoreMatches(re); std::string::size_type l2 = re.start(); std::string::size_type r = re.end(); @@ -536,38 +536,6 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args) } //---------------------------------------------------------------------------- -void cmStringCommand::ClearMatches(cmMakefile* mf) -{ - for (unsigned int i=0; i<10; i++) - { - char name[128]; - sprintf(name, "CMAKE_MATCH_%d", i); - const char* s = mf->GetDefinition(name); - if(s && *s != 0) - { - mf->AddDefinition(name, ""); - mf->MarkVariableAsUsed(name); - } - } -} - -//---------------------------------------------------------------------------- -void cmStringCommand::StoreMatches(cmMakefile* mf,cmsys::RegularExpression& re) -{ - for (unsigned int i=0; i<10; i++) - { - std::string m = re.match(i); - if(m.size() > 0) - { - char name[128]; - sprintf(name, "CMAKE_MATCH_%d", i); - mf->AddDefinition(name, re.match(i).c_str()); - mf->MarkVariableAsUsed(name); - } - } -} - -//---------------------------------------------------------------------------- bool cmStringCommand::HandleFindCommand(std::vector<std::string> const& args) { diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index 51069e7..8292e64 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -53,8 +53,6 @@ public: virtual std::string GetName() const { return "string";} cmTypeMacro(cmStringCommand, cmCommand); - static void ClearMatches(cmMakefile* mf); - static void StoreMatches(cmMakefile* mf, cmsys::RegularExpression& re); protected: bool HandleConfigureCommand(std::vector<std::string> const& args); bool HandleAsciiCommand(std::vector<std::string> const& args); |