summaryrefslogtreecommitdiff
path: root/src/libs/utils/stringutils.cpp
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-09-12 19:14:54 +0200
committerTobias Hunger <tobias.hunger@digia.com>2014-09-15 17:13:57 +0200
commit62da66a0aa4a680e3e7c1eb050c1a951c7f13369 (patch)
tree94b0a09f5a8e579faf3d4c204df91dd368b2429d /src/libs/utils/stringutils.cpp
parent1b11f9b3c0affaf447b901e2c3c7c6fce46a4341 (diff)
downloadqt-creator-62da66a0aa4a680e3e7c1eb050c1a951c7f13369.tar.gz
AbstractMacroExpander: expand macros recursively
Started-by: Tobias Hunger <tobias.hunger@digia.com> Change-Id: Id2e88efbb475221cd7c0347f7d5e7009e4372eec Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Diffstat (limited to 'src/libs/utils/stringutils.cpp')
-rw-r--r--src/libs/utils/stringutils.cpp49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/libs/utils/stringutils.cpp b/src/libs/utils/stringutils.cpp
index 5024bd5ab5..688b9d5967 100644
--- a/src/libs/utils/stringutils.cpp
+++ b/src/libs/utils/stringutils.cpp
@@ -115,6 +115,40 @@ QTCREATOR_UTILS_EXPORT QString withTildeHomePath(const QString &path)
return outPath;
}
+bool AbstractMacroExpander::expandNestedMacros(const QString &str, int *pos, QString *ret)
+{
+ QString varName;
+ QChar prev;
+ QChar c;
+
+ int i = *pos;
+ int strLen = str.length();
+ varName.reserve(strLen - i);
+ for (; i < strLen; prev = c) {
+ c = str.at(i++);
+ if (c == QLatin1Char('}')) {
+ if (varName.isEmpty()) { // replace "%{}" with "%"
+ *ret = QString(QLatin1Char('%'));
+ *pos = i;
+ return true;
+ }
+ if (resolveMacro(varName, ret)) {
+ *pos = i;
+ return true;
+ }
+ return false;
+ } else if (c == QLatin1Char('{') && prev == QLatin1Char('%')) {
+ if (!expandNestedMacros(str, &i, ret))
+ return false;
+ varName.chop(1);
+ varName += ret;
+ } else {
+ varName += c;
+ }
+ }
+ return false;
+}
+
int AbstractMacroExpander::findMacro(const QString &str, int *pos, QString *ret)
{
forever {
@@ -122,22 +156,13 @@ int AbstractMacroExpander::findMacro(const QString &str, int *pos, QString *ret)
if (openPos < 0)
return 0;
int varPos = openPos + 2;
- int closePos = str.indexOf(QLatin1Char('}'), varPos);
- if (closePos < 0)
- return 0;
- int varLen = closePos - varPos;
- if (varLen == 0) { // replace "%{}" with "%"
- *pos = openPos;
- *ret = QString(QLatin1Char('%'));
- return 3;
- }
- if (resolveMacro(str.mid(varPos, varLen), ret)) {
+ if (expandNestedMacros(str, &varPos, ret)) {
*pos = openPos;
- return varLen + 3;
+ return varPos - openPos;
}
// An actual expansion may be nested into a "false" one,
// so we continue right after the last %{.
- *pos = varPos;
+ *pos = openPos + 2;
}
}