diff options
author | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-09-12 19:14:54 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@digia.com> | 2014-09-15 17:13:57 +0200 |
commit | 62da66a0aa4a680e3e7c1eb050c1a951c7f13369 (patch) | |
tree | 94b0a09f5a8e579faf3d4c204df91dd368b2429d /src | |
parent | 1b11f9b3c0affaf447b901e2c3c7c6fce46a4341 (diff) | |
download | qt-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')
-rw-r--r-- | src/libs/utils/stringutils.cpp | 49 | ||||
-rw-r--r-- | src/libs/utils/stringutils.h | 2 |
2 files changed, 39 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; } } diff --git a/src/libs/utils/stringutils.h b/src/libs/utils/stringutils.h index c464363492..97d47d64e4 100644 --- a/src/libs/utils/stringutils.h +++ b/src/libs/utils/stringutils.h @@ -71,6 +71,8 @@ public: //! \param ret Replacement string on output //! \return True if the expando was found virtual bool resolveMacro(const QString &name, QString *ret) = 0; +private: + bool expandNestedMacros(const QString &str, int *pos, QString *ret); }; QTCREATOR_UTILS_EXPORT void expandMacros(QString *str, AbstractMacroExpander *mx); |