summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2007-02-15 13:36:08 -0500
committerBill Hoffman <bill.hoffman@kitware.com>2007-02-15 13:36:08 -0500
commit8ec0385e309070d6e41fbb1283340979dd31abb2 (patch)
tree376a8e6fca5c4ee0d49e981f514ebc017ba8558a
parentb14c6eb630b2f2c02d3a201db7a14ad15470e8b0 (diff)
downloadcmake-8ec0385e309070d6e41fbb1283340979dd31abb2.tar.gz
ENH: move @@ fix from main tree
-rw-r--r--CMakeLists.txt2
-rw-r--r--ChangeLog.manual2
-rw-r--r--Source/cmCommandArgumentParserHelper.cxx53
-rw-r--r--Source/cmCommandArgumentParserHelper.h6
-rw-r--r--Source/cmMakefile.cxx173
5 files changed, 58 insertions, 178 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a933e198b1..641b17d720 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,7 +7,7 @@ SET(CMake_VERSION_MAJOR 2)
SET(CMake_VERSION_MINOR 4)
SET(CMake_VERSION_PATCH 7)
# for an actual release this should not be defined
-SET(CMake_VERSION_RC 3)
+SET(CMake_VERSION_RC 4)
SET(CMake_VERSION "${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")
SET(CMake_VERSION_FULL "${CMake_VERSION}.${CMake_VERSION_PATCH}")
diff --git a/ChangeLog.manual b/ChangeLog.manual
index c3b3d50f36..3090515a4c 100644
--- a/ChangeLog.manual
+++ b/ChangeLog.manual
@@ -1,4 +1,6 @@
Changes in CMake 2.4.7
+* Fix for @@ in file names
+
* Fix for if command scope issues
* Fix for relative path issue with paths ending in /.
diff --git a/Source/cmCommandArgumentParserHelper.cxx b/Source/cmCommandArgumentParserHelper.cxx
index d446e15eea..c949d0dce3 100644
--- a/Source/cmCommandArgumentParserHelper.cxx
+++ b/Source/cmCommandArgumentParserHelper.cxx
@@ -27,7 +27,7 @@ cmCommandArgumentParserHelper::cmCommandArgumentParserHelper()
{
this->FileLine = -1;
this->FileName = 0;
-
+ this->RemoveEmpty = true;
this->EmptyVariable[0] = 0;
strcpy(this->DCURLYVariable, "${");
strcpy(this->RCURLYVariable, "}");
@@ -38,6 +38,7 @@ cmCommandArgumentParserHelper::cmCommandArgumentParserHelper()
this->NoEscapeMode = false;
this->ReplaceAtSyntax = false;
+ this->AtOnly = false;
}
@@ -71,6 +72,18 @@ char* cmCommandArgumentParserHelper::ExpandSpecialVariable(const char* key,
{
return this->ExpandVariable(var);
}
+ if(this->AtOnly)
+ {
+ std::string ref = "$";
+ ref += key;
+ ref += "{";
+ if(var)
+ {
+ ref += var;
+ }
+ ref += "}";
+ return this->AddString(ref.c_str());
+ }
if ( strcmp(key, "ENV") == 0 )
{
char *ptr = getenv(var);
@@ -92,8 +105,21 @@ char* cmCommandArgumentParserHelper::ExpandSpecialVariable(const char* key,
return 0;
}
-char* cmCommandArgumentParserHelper::ExpandVariable(const char* var)
+char* cmCommandArgumentParserHelper::ExpandVariable(const char* var,
+ bool doingAt)
{
+ // if we are in AtOnly mode, and we are not expanding an @ variable
+ // then put back the ${var} unexpanded
+ if(!doingAt && this->AtOnly)
+ {
+ std::string ref = "${";
+ if(var)
+ {
+ ref += var;
+ }
+ ref += "}";
+ return this->AddString(ref.c_str());
+ }
if(!var)
{
return 0;
@@ -109,6 +135,10 @@ char* cmCommandArgumentParserHelper::ExpandVariable(const char* var)
return this->AddString(ostr.str().c_str());
}
const char* value = this->Makefile->GetDefinition(var);
+ if(!value && !this->RemoveEmpty)
+ {
+ return 0;
+ }
if (this->EscapeQuotes && value)
{
return this->AddString(cmSystemTools::EscapeQuotes(value).c_str());
@@ -120,15 +150,28 @@ char* cmCommandArgumentParserHelper::ExpandVariableForAt(const char* var)
{
if(this->ReplaceAtSyntax)
{
- return this->ExpandVariable(var);
+ // try to expand the variable
+ char* ret = this->ExpandVariable(var, true);
+ // if the return was 0 and we want to replace empty strings
+ // then return an empty string
+ if(!ret && this->RemoveEmpty)
+ {
+ return this->AddString(ret);
}
- else
+ // if the ret was not 0, then return it
+ if(ret)
{
+ return ret;
+ }
+ }
+ // at this point we want to put it back because of one of these cases:
+ // - this->ReplaceAtSyntax is false
+ // - this->ReplaceAtSyntax is true, but this->RemoveEmpty is false,
+ // and the variable was not defined
std::string ref = "@";
ref += var;
ref += "@";
return this->AddString(ref.c_str());
- }
}
char* cmCommandArgumentParserHelper::CombineUnions(char* in1, char* in2)
diff --git a/Source/cmCommandArgumentParserHelper.h b/Source/cmCommandArgumentParserHelper.h
index 7f5078f534..5a225caf2a 100644
--- a/Source/cmCommandArgumentParserHelper.h
+++ b/Source/cmCommandArgumentParserHelper.h
@@ -58,7 +58,7 @@ public:
char* CombineUnions(char* in1, char* in2);
char* ExpandSpecialVariable(const char* key, const char* var);
- char* ExpandVariable(const char* var);
+ char* ExpandVariable(const char* var, bool doingAt=false);
char* ExpandVariableForAt(const char* var);
void SetResult(const char* value);
@@ -70,6 +70,8 @@ public:
void SetEscapeQuotes(bool b) { this->EscapeQuotes = b; }
void SetNoEscapeMode(bool b) { this->NoEscapeMode = b; }
void SetReplaceAtSyntax(bool b) { this->ReplaceAtSyntax = b; }
+ void SetRemoveEmpty(bool b) { this->RemoveEmpty = b; }
+ void SetAtOnly(bool b) { this->AtOnly = b; }
const char* GetError() { return this->ErrorString.c_str(); }
char EmptyVariable[1];
@@ -104,6 +106,8 @@ private:
std::string ErrorString;
bool NoEscapeMode;
bool ReplaceAtSyntax;
+ bool RemoveEmpty;
+ bool AtOnly;
};
#endif
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index dd9a88bda3..2494c9d914 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1719,20 +1719,18 @@ const char *cmMakefile::ExpandVariablesInString(std::string& source,
// It also supports the $ENV{VAR} syntax where VAR is looked up in
// the current environment variables.
- bool notParsed = true;
- if ( !atOnly )
- {
cmCommandArgumentParserHelper parser;
parser.SetMakefile(this);
parser.SetLineFile(line, filename);
parser.SetEscapeQuotes(escapeQuotes);
parser.SetNoEscapeMode(noEscapes);
parser.SetReplaceAtSyntax(replaceAt);
+ parser.SetRemoveEmpty(removeEmpty);
+ parser.SetAtOnly(atOnly);
int res = parser.ParseString(source.c_str(), 0);
if ( res )
{
source = parser.GetResult();
- notParsed = false;
}
else
{
@@ -1761,173 +1759,6 @@ const char *cmMakefile::ExpandVariablesInString(std::string& source,
cmSystemTools::Message(error.str().c_str());
}
}
- }
-
- if ( notParsed )
- {
-
- // start by look for $ or @ in the string
- std::string::size_type markerPos;
- if(atOnly)
- {
- markerPos = source.find_first_of("@");
- }
- else
- {
- markerPos = source.find_first_of("$@");
- }
- // if not found, or found as the last character, then leave quickly as
- // nothing needs to be expanded
- if((markerPos == std::string::npos) || (markerPos >= source.size()-1))
- {
- return source.c_str();
- }
- // current position
- std::string::size_type currentPos =0; // start at 0
- std::string result; // string with replacements
- // go until the the end of the string
- while((markerPos != std::string::npos) && (markerPos < source.size()-1))
- {
- // grab string from currentPos to the start of the variable
- // and add it to the result
- result += source.substr(currentPos, markerPos - currentPos);
- char endVariableMarker; // what is the end of the variable @ or }
- int markerStartSize = 1; // size of the start marker 1 or 2 or 5
- if(!atOnly && source[markerPos] == '$')
- {
- // ${var} case
- if(source[markerPos+1] == '{')
- {
- endVariableMarker = '}';
- markerStartSize = 2;
- }
- // $ENV{var} case
- else if(markerPos+4 < source.size() &&
- source[markerPos+4] == '{' &&
- !source.substr(markerPos+1, 3).compare("ENV"))
- {
- endVariableMarker = '}';
- markerStartSize = 5;
- }
- else
- {
- // bogus $ with no { so add $ to result and move on
- result += '$'; // add bogus $ back into string
- currentPos = markerPos+1; // move on
- // set end var to space so we can tell bogus
- endVariableMarker = ' ';
- }
- }
- else
- {
- // @VAR case
- endVariableMarker = '@';
- }
- // if it was a valid variable (started with @ or ${ or $ENV{ )
- if(endVariableMarker != ' ')
- {
- markerPos += markerStartSize; // move past marker
- // find the end variable marker starting at the markerPos
- // make sure it is a valid variable between
- std::string::size_type endVariablePos =
- source.find_first_not_of(
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_",
- markerPos);
- if(endVariablePos != std::string::npos &&
- source[endVariablePos] != endVariableMarker)
- {
- endVariablePos = std::string::npos;
- }
- if(endVariablePos == std::string::npos)
- {
- // no end marker found so add the bogus start
- if(endVariableMarker == '@')
- {
- result += '@';
- }
- else
- {
- result += (markerStartSize == 5 ? "$ENV{" : "${");
- }
- currentPos = markerPos;
- }
- else
- {
- // good variable remove it
- std::string var =
- source.substr(markerPos, endVariablePos - markerPos);
- bool found = false;
- if (markerStartSize == 5) // $ENV{
- {
- char *ptr = getenv(var.c_str());
- if (ptr)
- {
- if (escapeQuotes)
- {
- result += cmSystemTools::EscapeQuotes(ptr);
- }
- else
- {
- result += ptr;
- }
- found = true;
- }
- }
- else
- {
- const char* lookup = this->GetDefinition(var.c_str());
- if(lookup)
- {
- if (escapeQuotes)
- {
- result += cmSystemTools::EscapeQuotes(lookup);
- }
- else
- {
- result += lookup;
- }
- found = true;
- }
- else if(filename && (var == "CMAKE_CURRENT_LIST_FILE"))
- {
- result += filename;
- found = true;
- }
- else if(line >= 0 && (var == "CMAKE_CURRENT_LIST_LINE"))
- {
- cmOStringStream ostr;
- ostr << line;
- result += ostr.str();
- found = true;
- }
- }
- // if found add to result, if not, then it gets blanked
- if (!found)
- {
- // if no definition is found then add the var back
- if(!removeEmpty && endVariableMarker == '@')
- {
- result += "@";
- result += var;
- result += "@";
- }
- }
- // lookup var, and replace it
- currentPos = endVariablePos+1;
- }
- }
- if(atOnly)
- {
- markerPos = source.find_first_of("@", currentPos);
- }
- else
- {
- markerPos = source.find_first_of("$@", currentPos);
- }
- }
- result += source.substr(currentPos); // pick up the rest of the string
- source = result;
- }
return source.c_str();
}