summaryrefslogtreecommitdiff
path: root/Source/cmMakefile.cxx
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 /Source/cmMakefile.cxx
parentb14c6eb630b2f2c02d3a201db7a14ad15470e8b0 (diff)
downloadcmake-8ec0385e309070d6e41fbb1283340979dd31abb2.tar.gz
ENH: move @@ fix from main tree
Diffstat (limited to 'Source/cmMakefile.cxx')
-rw-r--r--Source/cmMakefile.cxx173
1 files changed, 2 insertions, 171 deletions
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();
}