CMake/Source/cmSeparateArgumentsCommand.cxx

110 lines
2.9 KiB
C++
Raw Normal View History

/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "cmSeparateArgumentsCommand.h"
// cmSeparateArgumentsCommand
2006-05-12 17:53:21 +00:00
bool cmSeparateArgumentsCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
if(args.empty())
{
this->SetError("must be given at least one argument.");
return false;
}
std::string var;
std::string command;
enum Mode { ModeOld, ModeUnix, ModeWindows };
Mode mode = ModeOld;
enum Doing { DoingNone, DoingVariable, DoingMode, DoingCommand };
Doing doing = DoingVariable;
for(unsigned int i=0; i < args.size(); ++i)
{
if(doing == DoingVariable)
{
var = args[i];
doing = DoingMode;
}
else if(doing == DoingMode && args[i] == "UNIX_COMMAND")
{
mode = ModeUnix;
doing = DoingCommand;
}
else if(doing == DoingMode && args[i] == "WINDOWS_COMMAND")
{
mode = ModeWindows;
doing = DoingCommand;
}
else if(doing == DoingCommand)
{
command = args[i];
doing = DoingNone;
}
else
{
cmOStringStream e;
e << "given unknown argument " << args[i];
this->SetError(e.str().c_str());
return false;
}
}
if(mode == ModeOld)
{
// Original space-replacement version of command.
if(const char* def = this->Makefile->GetDefinition(var.c_str()))
{
std::string value = def;
cmSystemTools::ReplaceString(value, " ", ";");
this->Makefile->AddDefinition(var.c_str(), value.c_str());
}
}
else
{
// Parse the command line.
std::vector<std::string> vec;
if(mode == ModeUnix)
{
cmSystemTools::ParseUnixCommandLine(command.c_str(), vec);
}
else // if(mode == ModeWindows)
{
cmSystemTools::ParseWindowsCommandLine(command.c_str(), vec);
}
// Construct the result list value.
std::string value;
const char* sep = "";
for(std::vector<std::string>::const_iterator vi = vec.begin();
vi != vec.end(); ++vi)
{
// Separate from the previous argument.
value += sep;
sep = ";";
// Preserve semicolons.
for(std::string::const_iterator si = vi->begin();
si != vi->end(); ++si)
{
if(*si == ';')
{
value += '\\';
}
value += *si;
}
}
this->Makefile->AddDefinition(var.c_str(), value.c_str());
}
return true;
}