summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2004-10-11 15:57:35 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2004-10-11 15:57:35 (GMT)
commit1ed5888d917c1b846c85e9204a6837b39c885f63 (patch)
treed110a6dd22869eb8965873a01cc984747290e509
parente78a57563cf3900c0a42ee580cb3787533a7f67c (diff)
downloadCMake-1ed5888d917c1b846c85e9204a6837b39c885f63.zip
CMake-1ed5888d917c1b846c85e9204a6837b39c885f63.tar.gz
CMake-1ed5888d917c1b846c85e9204a6837b39c885f63.tar.bz2
BUG: fix split program from args to not get stuck in an infinite loop in some cases
-rw-r--r--Source/kwsys/SystemTools.cxx38
1 files changed, 29 insertions, 9 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index 658f580..4c4a941 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -1828,14 +1828,18 @@ bool SystemTools::GetShortPath(const char* path, kwsys_stl::string& shortPath)
}
void SystemTools::SplitProgramFromArgs(const char* path,
- kwsys_stl::string& program, kwsys_stl::string& args)
+ kwsys_stl::string& program, kwsys_stl::string& args)
{
+ // see if this is a full path to a program
+ // if so then set program to path and args to nothing
if(SystemTools::FileExists(path))
{
program = path;
args = "";
return;
}
+ // Try to find the program in the path, note the program
+ // may have spaces in its name so we have to look for it
kwsys_stl::vector<kwsys_stl::string> e;
kwsys_stl::string findProg = SystemTools::FindProgram(path, e);
if(findProg.size())
@@ -1844,32 +1848,48 @@ void SystemTools::SplitProgramFromArgs(const char* path,
args = "";
return;
}
+
+ // Now try and peel off space separated chunks from the end of the string
+ // so the largest path possible is found allowing for spaces in the path
kwsys_stl::string dir = path;
kwsys_stl::string::size_type spacePos = dir.rfind(' ');
- if(spacePos == kwsys_stl::string::npos)
- {
- program = "";
- args = "";
- return;
- }
while(spacePos != kwsys_stl::string::npos)
{
kwsys_stl::string tryProg = dir.substr(0, spacePos);
+ // See if the file exists
if(SystemTools::FileExists(tryProg.c_str()))
{
program = tryProg;
+ // remove trailing spaces from program
+ kwsys_stl::string::size_type pos = program.size()-1;
+ while(program[pos] == ' ')
+ {
+ program.erase(pos);
+ pos--;
+ }
args = dir.substr(spacePos, dir.size()-spacePos);
return;
- }
+ }
+ // Now try and find the the program in the path
findProg = SystemTools::FindProgram(tryProg.c_str(), e);
if(findProg.size())
{
program = findProg;
+ // remove trailing spaces from program
+ kwsys_stl::string::size_type pos = program.size()-1;
+ while(program[pos] == ' ')
+ {
+ program.erase(pos);
+ pos--;
+ }
args = dir.substr(spacePos, dir.size()-spacePos);
return;
}
- spacePos = dir.rfind(' ', spacePos--);
+ // move past the space for the next search
+ spacePos--;
+ spacePos = dir.rfind(' ', spacePos);
}
+
program = "";
args = "";
}