in src/unix-adapter/main.cc [323:358]
static std::string argvToCommandLine(const std::vector<std::string> &argv)
{
std::string result;
for (size_t argIndex = 0; argIndex < argv.size(); ++argIndex) {
if (argIndex > 0)
result.push_back(' ');
const char *arg = argv[argIndex].c_str();
const bool quote =
strchr(arg, ' ') != NULL ||
strchr(arg, '\t') != NULL ||
*arg == '\0';
if (quote)
result.push_back('\"');
int bsCount = 0;
for (const char *p = arg; *p != '\0'; ++p) {
if (*p == '\\') {
bsCount++;
} else if (*p == '\"') {
result.append(bsCount * 2 + 1, '\\');
result.push_back('\"');
bsCount = 0;
} else {
result.append(bsCount, '\\');
bsCount = 0;
result.push_back(*p);
}
}
if (quote) {
result.append(bsCount * 2, '\\');
result.push_back('\"');
} else {
result.append(bsCount, '\\');
}
}
return result;
}