|
|
@@ -1121,7 +1121,7 @@ void cmSystemTools::GlobDirs(const std::string& path,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void cmSystemTools::ExpandListArgument(const std::string& arg,
|
|
|
+void cmSystemTools::ExpandListArgument(cm::string_view arg,
|
|
|
std::vector<std::string>& argsOut,
|
|
|
bool emptyArgs)
|
|
|
{
|
|
|
@@ -1129,25 +1129,29 @@ void cmSystemTools::ExpandListArgument(const std::string& arg,
|
|
|
if (!emptyArgs && arg.empty()) {
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
// if there are no ; in the name then just copy the current string
|
|
|
- if (arg.find(';') == std::string::npos) {
|
|
|
- argsOut.push_back(arg);
|
|
|
+ if (arg.find(';') == cm::string_view::npos) {
|
|
|
+ argsOut.emplace_back(arg);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
std::string newArg;
|
|
|
- const char* last = arg.c_str();
|
|
|
// Break the string at non-escaped semicolons not nested in [].
|
|
|
int squareNesting = 0;
|
|
|
- for (const char* c = last; *c; ++c) {
|
|
|
+ cm::string_view::iterator last = arg.begin();
|
|
|
+ cm::string_view::iterator const cend = arg.end();
|
|
|
+ for (cm::string_view::iterator c = last; c != cend; ++c) {
|
|
|
switch (*c) {
|
|
|
case '\\': {
|
|
|
// We only want to allow escaping of semicolons. Other
|
|
|
// escapes should not be processed here.
|
|
|
- const char* next = c + 1;
|
|
|
- if (*next == ';') {
|
|
|
- newArg.append(last, c - last);
|
|
|
+ cm::string_view::iterator cnext = c + 1;
|
|
|
+ if ((cnext != cend) && *cnext == ';') {
|
|
|
+ newArg.append(last, c);
|
|
|
// Skip over the escape character
|
|
|
- last = c = next;
|
|
|
+ last = cnext;
|
|
|
+ c = cnext;
|
|
|
}
|
|
|
} break;
|
|
|
case '[': {
|
|
|
@@ -1160,7 +1164,7 @@ void cmSystemTools::ExpandListArgument(const std::string& arg,
|
|
|
// Break the string here if we are not nested inside square
|
|
|
// brackets.
|
|
|
if (squareNesting == 0) {
|
|
|
- newArg.append(last, c - last);
|
|
|
+ newArg.append(last, c);
|
|
|
// Skip over the semicolon
|
|
|
last = c + 1;
|
|
|
if (!newArg.empty() || emptyArgs) {
|
|
|
@@ -1175,15 +1179,15 @@ void cmSystemTools::ExpandListArgument(const std::string& arg,
|
|
|
} break;
|
|
|
}
|
|
|
}
|
|
|
- newArg.append(last);
|
|
|
+ newArg.append(last, cend);
|
|
|
if (!newArg.empty() || emptyArgs) {
|
|
|
// Add the last argument if the string is not empty.
|
|
|
- argsOut.push_back(newArg);
|
|
|
+ argsOut.push_back(std::move(newArg));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
std::vector<std::string> cmSystemTools::ExpandedListArgument(
|
|
|
- const std::string& arg, bool emptyArgs)
|
|
|
+ cm::string_view arg, bool emptyArgs)
|
|
|
{
|
|
|
std::vector<std::string> argsOut;
|
|
|
ExpandListArgument(arg, argsOut, emptyArgs);
|