From 6fe8624b7ff39f8511f4f4d7ebcbc5681932a6a5 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 22 Nov 2010 14:56:55 -0500 Subject: Fix parsing of cache variables without a type These mainly come from the command line or manual entries in the CMakeCache.txt file. We want to stop at the first '=' because this is what is most likely to have been meant. The variable can be quoted if the '=' is intended. Caveat: What if one wants both '"' and '=' in a variable name? --- Source/cmCacheManager.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index 2aa6236..fe6467a 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -97,10 +97,10 @@ bool cmCacheManager::ParseEntry(const char* entry, std::string& var, std::string& value) { - // input line is: key:type=value + // input line is: key=value static cmsys::RegularExpression reg( - "^([^:]*)=(.*[^\r\t ]|[\r\t ]*)[\r\t ]*$"); - // input line is: "key":type=value + "^([^=]*)=(.*[^\r\t ]|[\r\t ]*)[\r\t ]*$"); + // input line is: "key"=value static cmsys::RegularExpression regQuoted( "^\"([^\"]*)\"=(.*[^\r\t ]|[\r\t ]*)[\r\t ]*$"); bool flag = false; -- cgit v0.12 From 90abc3a027ba68e3866e7cd0e2f8eebd528b6ccb Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 22 Nov 2010 15:14:21 -0500 Subject: Use cmCacheManager to load entries from the cache --- Source/cmLoadCacheCommand.cxx | 39 +++------------------------------------ Source/cmLoadCacheCommand.h | 1 - 2 files changed, 3 insertions(+), 37 deletions(-) diff --git a/Source/cmLoadCacheCommand.cxx b/Source/cmLoadCacheCommand.cxx index d2a07dc..b06e2f9 100644 --- a/Source/cmLoadCacheCommand.cxx +++ b/Source/cmLoadCacheCommand.cxx @@ -174,7 +174,9 @@ void cmLoadCacheCommand::CheckLine(const char* line) // Check one line of the cache file. std::string var; std::string value; - if(this->ParseEntry(line, var, value)) + cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED; + if(cmCacheManager::ParseEntry(line, var, value, type) || + cmCacheManager::ParseEntry(line, var, value)) { // Found a real entry. See if this one was requested. if(this->VariablesToRead.find(var) != this->VariablesToRead.end()) @@ -193,38 +195,3 @@ void cmLoadCacheCommand::CheckLine(const char* line) } } } - -//---------------------------------------------------------------------------- -bool cmLoadCacheCommand::ParseEntry(const char* entry, std::string& var, - std::string& value) -{ - // input line is: key:type=value - cmsys::RegularExpression reg("^([^:]*):([^=]*)=(.*[^\t ]|[\t ]*)[\t ]*$"); - // input line is: "key":type=value - cmsys::RegularExpression - regQuoted("^\"([^\"]*)\":([^=]*)=(.*[^\t ]|[\t ]*)[\t ]*$"); - bool flag = false; - if(regQuoted.find(entry)) - { - var = regQuoted.match(1); - value = regQuoted.match(3); - flag = true; - } - else if (reg.find(entry)) - { - var = reg.match(1); - value = reg.match(3); - flag = true; - } - - // if value is enclosed in single quotes ('foo') then remove them - // it is used to enclose trailing space or tab - if (flag && - value.size() >= 2 && - value[0] == '\'' && - value[value.size() - 1] == '\'') - { - value = value.substr(1, value.size() - 2); - } - return flag; -} diff --git a/Source/cmLoadCacheCommand.h b/Source/cmLoadCacheCommand.h index b06d94d..8ecee4a 100644 --- a/Source/cmLoadCacheCommand.h +++ b/Source/cmLoadCacheCommand.h @@ -83,7 +83,6 @@ protected: bool ReadWithPrefix(std::vector const& args); void CheckLine(const char* line); - bool ParseEntry(const char* entry, std::string& var, std::string& value); }; -- cgit v0.12 From 122ebf12976ce370d78aa14594baf39f30b5c9ee Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 22 Nov 2010 15:17:51 -0500 Subject: Support manual cache entries --- Source/cmCacheManager.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index fe6467a..eabdf87 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -253,7 +253,8 @@ bool cmCacheManager::LoadCache(const char* path, } } e.SetProperty("HELPSTRING", helpString.c_str()); - if(cmCacheManager::ParseEntry(realbuffer, entryKey, e.Value, e.Type)) + if(cmCacheManager::ParseEntry(realbuffer, entryKey, e.Value, e.Type) || + cmCacheManager::ParseEntry(realbuffer, entryKey, e.Value)) { if ( excludes.find(entryKey) == excludes.end() ) { -- cgit v0.12 From 8b143fab66a2d1e93bf01eb7837a33e52644c396 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 22 Nov 2010 15:45:30 -0500 Subject: Condense parsing of cache entries If a cache line is being parsed, it shouldn't matter whether it has a type or not; just parse it however possible. --- Source/cmCacheManager.cxx | 14 +++++++++----- Source/cmCacheManager.h | 4 ---- Source/cmLoadCacheCommand.cxx | 3 +-- Source/cmake.cxx | 3 +-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index eabdf87..2baacbf 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -93,9 +93,9 @@ bool cmCacheManager::LoadCache(const char* path, return this->LoadCache(path, internal, emptySet, emptySet); } -bool cmCacheManager::ParseEntry(const char* entry, - std::string& var, - std::string& value) +static bool ParseEntryWithoutType(const char* entry, + std::string& var, + std::string& value) { // input line is: key=value static cmsys::RegularExpression reg( @@ -169,6 +169,11 @@ bool cmCacheManager::ParseEntry(const char* entry, value.size() - 2); } + if (!flag) + { + return ParseEntryWithoutType(entry, var, value); + } + return flag; } @@ -253,8 +258,7 @@ bool cmCacheManager::LoadCache(const char* path, } } e.SetProperty("HELPSTRING", helpString.c_str()); - if(cmCacheManager::ParseEntry(realbuffer, entryKey, e.Value, e.Type) || - cmCacheManager::ParseEntry(realbuffer, entryKey, e.Value)) + if(cmCacheManager::ParseEntry(realbuffer, entryKey, e.Value, e.Type)) { if ( excludes.find(entryKey) == excludes.end() ) { diff --git a/Source/cmCacheManager.h b/Source/cmCacheManager.h index da14966..314017b 100644 --- a/Source/cmCacheManager.h +++ b/Source/cmCacheManager.h @@ -139,10 +139,6 @@ public: std::string& value, CacheEntryType& type); - static bool ParseEntry(const char* entry, - std::string& var, - std::string& value); - ///! Get a value from the cache given a key const char* GetCacheValue(const char* key) const; diff --git a/Source/cmLoadCacheCommand.cxx b/Source/cmLoadCacheCommand.cxx index b06e2f9..a239e55 100644 --- a/Source/cmLoadCacheCommand.cxx +++ b/Source/cmLoadCacheCommand.cxx @@ -175,8 +175,7 @@ void cmLoadCacheCommand::CheckLine(const char* line) std::string var; std::string value; cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED; - if(cmCacheManager::ParseEntry(line, var, value, type) || - cmCacheManager::ParseEntry(line, var, value)) + if(cmCacheManager::ParseEntry(line, var, value, type)) { // Found a real entry. See if this one was requested. if(this->VariablesToRead.find(var) != this->VariablesToRead.end()) diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 2ebd165..e332955 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -362,8 +362,7 @@ bool cmake::SetCacheArgs(const std::vector& args) } std::string var, value; cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED; - if(cmCacheManager::ParseEntry(entry.c_str(), var, value, type) || - cmCacheManager::ParseEntry(entry.c_str(), var, value)) + if(cmCacheManager::ParseEntry(entry.c_str(), var, value, type)) { this->CacheManager->AddCacheEntry(var.c_str(), value.c_str(), "No help, variable specified on the command line.", type); -- cgit v0.12