| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmSeparateArgumentsCommand.h" |
| |
| #include <algorithm> |
| #include <sstream> |
| |
| #include "cmMakefile.h" |
| #include "cmSystemTools.h" |
| |
| class cmExecutionStatus; |
| |
| // cmSeparateArgumentsCommand |
| 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 { |
| std::ostringstream e; |
| e << "given unknown argument " << args[i]; |
| this->SetError(e.str()); |
| return false; |
| } |
| } |
| |
| if (mode == ModeOld) { |
| // Original space-replacement version of command. |
| if (const char* def = this->Makefile->GetDefinition(var)) { |
| std::string value = def; |
| std::replace(value.begin(), value.end(), ' ', ';'); |
| this->Makefile->AddDefinition(var, 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, value.c_str()); |
| } |
| |
| return true; |
| } |