Utils: Support pattern substitution in macro expansion

Syntax is similar to bash substitution:

%{variable/pattern/replacement} takes the expansion of variable, and
replaces the regular expression pattern with replacement once.

%{variable//pattern/replacement} replaces all occurrences.

Capture groups are supported for both forms.

Change-Id: I67ff91e2dad4dd8be81573ea446cd1093a05ccf6
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Orgad Shaneh
2016-06-26 16:51:11 +03:00
committed by Orgad Shaneh
parent 7e1b4ccebb
commit 2ec82a2a93
2 changed files with 67 additions and 2 deletions
@@ -50,6 +50,18 @@ public:
*ret = QLatin1String("bar");
return true;
}
if (name == "slash") {
*ret = "foo/bar";
return true;
}
if (name == "sl/sh") {
*ret = "slash";
return true;
}
if (name == "JS:foo") {
*ret = "bar";
return true;
}
return false;
}
};
@@ -129,6 +141,18 @@ void tst_StringUtils::testMacroExpander_data()
{ "%{%{a}}}post", "ho}post" },
{ "%{hi%{a}}", "bar" },
{ "%{hi%{%{foo}}}", "bar" },
{ "%{hihi/b/c}", "car" },
{ "%{hihi/a/}", "br" }, // empty replacement
{ "%{hihi/b}", "bar" }, // incomplete substitution
{ "%{hihi/./c}", "car" },
{ "%{hihi//./c}", "ccc" },
{ "%{hihi/(.)(.)r/\\2\\1c}", "abc" }, // no escape for capture groups
{ "%{hihi/b/c/d}", "c/dar" },
{ "%{hihi/a/e{\\}e}", "be{}er" }, // escape closing brace
{ "%{slash/o\\/b/ol's c}", "fool's car" },
{ "%{sl\\/sh/(.)(a)(.)/\\2\\1\\3as}", "salsash" }, // escape in variable name
{ "%{JS:foo/b/c}", "%{JS:foo/b/c}" }, // No replacement for JS (all considered varName)
{ "%{%{a}%{a}/b/c}", "car" },
};
for (unsigned i = 0; i < sizeof(vals)/sizeof(vals[0]); i++)