BUG: fix split program from args to not get stuck in an infinite loop in some cases

This commit is contained in:
Bill Hoffman 2004-10-11 11:57:35 -04:00
parent e78a57563c
commit 1ed5888d91

View File

@ -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 = "";
}