From 1ed5888d917c1b846c85e9204a6837b39c885f63 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Mon, 11 Oct 2004 11:57:35 -0400 Subject: BUG: fix split program from args to not get stuck in an infinite loop in some cases --- Source/kwsys/SystemTools.cxx | 38 +++++++++++++++++++++++++++++--------- 1 file 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 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 = ""; } -- cgit v0.12