summaryrefslogtreecommitdiffstats
path: root/Source/cmSystemTools.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmSystemTools.cxx')
-rw-r--r--Source/cmSystemTools.cxx297
1 files changed, 73 insertions, 224 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index ff27805..28163a8 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -843,168 +843,6 @@ std::string cmSystemTools::ConvertToWindowsOutputPath(const char* path)
return ret;
}
-inline void RemoveComments(char* ptr)
-{
- while(*ptr)
- {
- if(*ptr == '#')
- {
- *ptr = 0;
- break;
- }
- ++ptr;
- }
-}
-
-bool cmSystemTools::ParseFunction(std::ifstream& fin,
- std::string& name,
- std::vector<std::string>& arguments,
- const char* filename,
- bool& parseError)
-{
- parseError = false;
- name = "";
- arguments = std::vector<std::string>();
- const int BUFFER_SIZE = 4096;
- char inbuffer[BUFFER_SIZE];
- if(!fin)
- {
- return false;
- }
- if(fin.getline(inbuffer, BUFFER_SIZE ) )
- {
- RemoveComments(inbuffer);
- cmRegularExpression blankLine("^[ \t\r]*$");
-// cmRegularExpression comment("^[ \t]*#.*$");
- cmRegularExpression oneLiner("^[ \t]*([A-Za-z_0-9]*)[ \t]*\\((.*)\\)[ \t\r]*$");
- cmRegularExpression multiLine("^[ \t]*([A-Za-z_0-9]*)[ \t]*\\((.*)$");
- cmRegularExpression lastLine("^(.*)\\)[ \t\r]*$");
-
- // check for blank line or comment
- if(blankLine.find(inbuffer) )
- {
- return false;
- }
- // look for a oneline fun(arg arg2)
- else if(oneLiner.find(inbuffer))
- {
- // the arguments are the second match
- std::string args = oneLiner.match(2);
- name = oneLiner.match(1);
- // break up the arguments
- cmSystemTools::GetArguments(args, arguments);
- return true;
- }
- // look for a start of a multiline with no trailing ")" fun(arg arg2
- else if(multiLine.find(inbuffer))
- {
- name = multiLine.match(1);
- std::string args = multiLine.match(2);
- cmSystemTools::GetArguments(args, arguments);
- // Read lines until the closing paren is hit
- bool done = false;
- while(!done)
- {
- // read lines until the end paren is found
- if(fin.getline(inbuffer, BUFFER_SIZE ) )
- {
- RemoveComments(inbuffer);
- // Check for comment lines and ignore them.
- if(blankLine.find(inbuffer))
- { continue; }
- // Is this the last line?
- if(lastLine.find(inbuffer))
- {
- done = true;
- std::string gargs = lastLine.match(1);
- cmSystemTools::GetArguments(gargs, arguments);
- }
- else
- {
- std::string line = inbuffer;
- cmSystemTools::GetArguments(line, arguments);
- }
- }
- else
- {
- parseError = true;
- cmSystemTools::Error("Parse error in read function missing end )\nIn File: ",
- filename, "\nCurrent line:", inbuffer);
- return false;
- }
- }
- return true;
- }
- else
- {
- parseError = true;
- cmSystemTools::Error("Parse error in read function\nIn file:",
- filename, "\nCurrent line:", inbuffer);
- return false;
- }
- }
- return false;
-
-}
-
-void cmSystemTools::GetArguments(std::string& line,
- std::vector<std::string>& arguments)
-{
- // Match a normal argument (not quoted, no spaces).
- cmRegularExpression normalArgument("[ \t]*(([^ \t\r\\]|[\\].)+)[ \t\r]*");
- // Match a quoted argument (surrounded by double quotes, spaces allowed).
- cmRegularExpression quotedArgument("[ \t]*(\"([^\"\\]|[\\].)*\")[ \t\r]*");
-
- bool done = false;
- while(!done)
- {
- std::string arg;
- std::string::size_type endpos=0;
- bool foundQuoted = quotedArgument.find(line.c_str());
- bool foundNormal = normalArgument.find(line.c_str());
-
- if(foundQuoted && foundNormal)
- {
- // Both matches were found. Take the earlier one.
- // Favor double-quoted version if there is a tie.
- if(normalArgument.start(1) < quotedArgument.start(1))
- {
- arg = normalArgument.match(1);
- endpos = normalArgument.end(1);
- }
- else
- {
- arg = quotedArgument.match(1);
- endpos = quotedArgument.end(1);
- // Strip off the double quotes on the ends.
- arg = arg.substr(1, arg.length()-2);
- }
- }
- else if (foundQuoted)
- {
- arg = quotedArgument.match(1);
- endpos = quotedArgument.end(1);
- // Strip off the double quotes on the ends.
- arg = arg.substr(1, arg.length()-2);
- }
- else if(foundNormal)
- {
- arg = normalArgument.match(1);
- endpos = normalArgument.end(1);
- }
- else
- {
- done = true;
- }
- if(!done)
- {
- arguments.push_back(cmSystemTools::RemoveEscapes(arg.c_str()));
- line = line.substr(endpos, line.length() - endpos);
- }
- }
-}
-
-
std::string cmSystemTools::RemoveEscapes(const char* s)
{
std::string result = "";
@@ -2141,90 +1979,101 @@ void cmSystemTools::GlobDirs(const char *fullPath,
}
-void cmSystemTools::ExpandListArguments(std::vector<std::string> const& arguments,
- std::vector<std::string>& newargs)
+void cmSystemTools::ExpandList(std::vector<std::string> const& arguments,
+ std::vector<std::string>& newargs)
{
std::vector<std::string>::const_iterator i;
- std::string newarg;
for(i = arguments.begin();i != arguments.end(); ++i)
{
- // if there are no ; in the name then just copy the current string
- if(i->find(';') == std::string::npos)
- {
- newargs.push_back(*i);
- }
- else
+ cmSystemTools::ExpandListArgument(*i, newargs);
+ }
+}
+
+void cmSystemTools::ExpandListArgument(const std::string& arg,
+ std::vector<std::string>& newargs)
+{
+ std::string newarg;
+ // If argument is empty, it is an empty list.
+ if(arg.length() == 0)
+ {
+ return;
+ }
+ // if there are no ; in the name then just copy the current string
+ if(arg.find(';') == std::string::npos)
+ {
+ newargs.push_back(arg);
+ }
+ else
+ {
+ std::string::size_type start = 0;
+ std::string::size_type endpos = 0;
+ const std::string::size_type size = arg.size();
+ // break up ; separated sections of the string into separate strings
+ while(endpos != size)
{
- std::string::size_type start = 0;
- std::string::size_type endpos = 0;
- const std::string::size_type size = i->size();
- // break up ; separated sections of the string into separate strings
- while(endpos != size)
+ endpos = arg.find(';', start);
+ if(endpos == std::string::npos)
{
- endpos = i->find(';', start);
+ endpos = arg.size();
+ }
+ else
+ {
+ // skip right over escaped ; ( \; )
+ while((endpos != std::string::npos)
+ && (endpos > 0)
+ && ((arg)[endpos-1] == '\\') )
+ {
+ endpos = arg.find(';', endpos+1);
+ }
if(endpos == std::string::npos)
{
- endpos = i->size();
+ endpos = arg.size();
}
- else
+ }
+ std::string::size_type len = endpos - start;
+ if (len > 0)
+ {
+ // check for a closing ] after the start position
+ if(arg.find('[', start) == std::string::npos)
{
- // skip right over escaped ; ( \; )
- while((endpos != std::string::npos)
- && (endpos > 0)
- && ((*i)[endpos-1] == '\\') )
- {
- endpos = i->find(';', endpos+1);
- }
- if(endpos == std::string::npos)
- {
- endpos = i->size();
- }
+ // if there is no [ in the string then keep it
+ newarg = arg.substr(start, len);
}
- std::string::size_type len = endpos - start;
- if (len > 0)
+ else
{
- // check for a closing ] after the start position
- if(i->find('[', start) == std::string::npos)
+ int opencount = 0;
+ int closecount = 0;
+ for(std::string::size_type j = start; j < endpos; ++j)
{
- // if there is no [ in the string then keep it
- newarg = i->substr(start, len);
- }
- else
- {
- int opencount = 0;
- int closecount = 0;
- for(std::string::size_type j = start; j < endpos; ++j)
+ if(arg.at(j) == '[')
{
- if(i->at(j) == '[')
- {
- ++opencount;
- }
- else if (i->at(j) == ']')
- {
- ++closecount;
- }
+ ++opencount;
}
- if(opencount != closecount)
+ else if (arg.at(j) == ']')
{
- // skip this one
- endpos = i->find(';', endpos+1);
- if(endpos == std::string::npos)
- {
- endpos = i->size();
- }
- len = endpos - start;
+ ++closecount;
}
- newarg = i->substr(start, len);
}
- std::string::size_type pos = newarg.find("\\;");
- if(pos != std::string::npos)
+ if(opencount != closecount)
{
- newarg.erase(pos, 1);
+ // skip this one
+ endpos = arg.find(';', endpos+1);
+ if(endpos == std::string::npos)
+ {
+ endpos = arg.size();
+ }
+ len = endpos - start;
}
- newargs.push_back(newarg);
+ newarg = arg.substr(start, len);
}
- start = endpos+1;
+ std::string::size_type pos = newarg.find("\\;");
+ if(pos != std::string::npos)
+ {
+ newarg.erase(pos, 1);
+ }
+ newargs.push_back(newarg);
}
+ start = endpos+1;
}
}
}