diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2004-10-11 15:57:35 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2004-10-11 15:57:35 (GMT) |
commit | 1ed5888d917c1b846c85e9204a6837b39c885f63 (patch) | |
tree | d110a6dd22869eb8965873a01cc984747290e509 | |
parent | e78a57563cf3900c0a42ee580cb3787533a7f67c (diff) | |
download | CMake-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.cxx | 38 |
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 = ""; } |