|
|
@@ -603,6 +603,56 @@ std::vector<std::string> cmSystemTools::ParseArguments(const char* command)
|
|
|
return args;
|
|
|
}
|
|
|
|
|
|
+bool cmSystemTools::SplitProgramFromArgs(std::string const& command,
|
|
|
+ std::string& program,
|
|
|
+ std::string& args)
|
|
|
+{
|
|
|
+ const char* c = command.c_str();
|
|
|
+
|
|
|
+ // Skip leading whitespace.
|
|
|
+ while (isspace(static_cast<unsigned char>(*c))) {
|
|
|
+ ++c;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Parse one command-line element up to an unquoted space.
|
|
|
+ bool in_escape = false;
|
|
|
+ bool in_double = false;
|
|
|
+ bool in_single = false;
|
|
|
+ for (; *c; ++c) {
|
|
|
+ if (in_single) {
|
|
|
+ if (*c == '\'') {
|
|
|
+ in_single = false;
|
|
|
+ } else {
|
|
|
+ program += *c;
|
|
|
+ }
|
|
|
+ } else if (in_escape) {
|
|
|
+ in_escape = false;
|
|
|
+ program += *c;
|
|
|
+ } else if (*c == '\\') {
|
|
|
+ in_escape = true;
|
|
|
+ } else if (in_double) {
|
|
|
+ if (*c == '"') {
|
|
|
+ in_double = false;
|
|
|
+ } else {
|
|
|
+ program += *c;
|
|
|
+ }
|
|
|
+ } else if (*c == '"') {
|
|
|
+ in_double = true;
|
|
|
+ } else if (*c == '\'') {
|
|
|
+ in_single = true;
|
|
|
+ } else if (isspace(static_cast<unsigned char>(*c))) {
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ program += *c;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // The remainder of the command line holds unparsed arguments.
|
|
|
+ args = c;
|
|
|
+
|
|
|
+ return !in_single && !in_escape && !in_double;
|
|
|
+}
|
|
|
+
|
|
|
size_t cmSystemTools::CalculateCommandLineLengthLimit()
|
|
|
{
|
|
|
size_t sz =
|