[cmake-commits] hoffman committed cmCommandArgumentParserHelper.cxx
1.12.2.4 1.12.2.5 cmCommandArgumentParserHelper.h 1.8.2.1
1.8.2.2 cmMakefile.cxx 1.335.2.11 1.335.2.12
cmake-commits at cmake.org
cmake-commits at cmake.org
Thu Feb 15 13:36:10 EST 2007
Update of /cvsroot/CMake/CMake/Source
In directory public:/mounts/ram/cvs-serv20041/Source
Modified Files:
Tag: CMake-2-4
cmCommandArgumentParserHelper.cxx
cmCommandArgumentParserHelper.h cmMakefile.cxx
Log Message:
ENH: move @@ fix from main tree
Index: cmCommandArgumentParserHelper.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmCommandArgumentParserHelper.h,v
retrieving revision 1.8.2.1
retrieving revision 1.8.2.2
diff -u -d -r1.8.2.1 -r1.8.2.2
--- cmCommandArgumentParserHelper.h 13 Oct 2006 14:52:02 -0000 1.8.2.1
+++ cmCommandArgumentParserHelper.h 15 Feb 2007 18:36:08 -0000 1.8.2.2
@@ -58,7 +58,7 @@
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 @@
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 @@
std::string ErrorString;
bool NoEscapeMode;
bool ReplaceAtSyntax;
+ bool RemoveEmpty;
+ bool AtOnly;
};
#endif
Index: cmCommandArgumentParserHelper.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmCommandArgumentParserHelper.cxx,v
retrieving revision 1.12.2.4
retrieving revision 1.12.2.5
diff -u -d -r1.12.2.4 -r1.12.2.5
--- cmCommandArgumentParserHelper.cxx 13 Oct 2006 14:52:02 -0000 1.12.2.4
+++ cmCommandArgumentParserHelper.cxx 15 Feb 2007 18:36:08 -0000 1.12.2.5
@@ -27,7 +27,7 @@
{
this->FileLine = -1;
this->FileName = 0;
-
+ this->RemoveEmpty = true;
this->EmptyVariable[0] = 0;
strcpy(this->DCURLYVariable, "${");
strcpy(this->RCURLYVariable, "}");
@@ -38,6 +38,7 @@
this->NoEscapeMode = false;
this->ReplaceAtSyntax = false;
+ this->AtOnly = false;
}
@@ -71,6 +72,18 @@
{
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 @@
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 @@
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 @@
{
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)
Index: cmMakefile.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmMakefile.cxx,v
retrieving revision 1.335.2.11
retrieving revision 1.335.2.12
diff -u -d -r1.335.2.11 -r1.335.2.12
--- cmMakefile.cxx 28 Nov 2006 21:03:51 -0000 1.335.2.11
+++ cmMakefile.cxx 15 Feb 2007 18:36:08 -0000 1.335.2.12
@@ -1719,20 +1719,18 @@
// 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 @@
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();
}
More information about the Cmake-commits
mailing list