diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-01-02 19:09:46 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-01-02 19:27:14 +0100 |
commit | 39c04c9b9b5ed5b23d8410d22296c67be54dbef0 (patch) | |
tree | e4c0c896b223447279226456cd58b89b25d74f57 | |
parent | 95150aae29d1660c36e96d22b87b84c1120733db (diff) |
make macro substitutions reusable
MacroTable::parseSubstitutionStatement now returns an Substitution
object that can be applied on multiple values.
Change-Id: I48329701666020f3d8d551b56696d8aa9038cbd2
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
-rw-r--r-- | src/jomlib/macrotable.cpp | 24 | ||||
-rw-r--r-- | src/jomlib/macrotable.h | 9 | ||||
-rw-r--r-- | src/jomlib/makefile.cpp | 4 |
3 files changed, 28 insertions, 9 deletions
diff --git a/src/jomlib/macrotable.cpp b/src/jomlib/macrotable.cpp index e4fe900..6c1c8ed 100644 --- a/src/jomlib/macrotable.cpp +++ b/src/jomlib/macrotable.cpp @@ -237,8 +237,10 @@ QString MacroTable::expandMacros(const QString& str, bool inDependentsLine, QSet { QString macroValue = cycleCheckedMacroValue(macroName, usedMacros); macroValue = expandMacros(macroValue, inDependentsLine, usedMacros); - if (macroNameEnd != macroInvokationEnd) - parseSubstitutionStatement(str, macroNameEnd + 1, macroValue, macroInvokationEnd); + if (macroNameEnd != macroInvokationEnd) { + const Substitution s = parseSubstitutionStatement(str, macroNameEnd + 1, macroInvokationEnd); + applySubstitution(s, macroValue); + } usedMacros.remove(macroName); ret.append(macroValue); } @@ -334,7 +336,9 @@ void MacroTable::dump() const * equalsSignIdx: ^ * macroInvokationEndIdx: ^ */ -void MacroTable::parseSubstitutionStatement(const QString &str, int substitutionStartIdx, QString &value, int ¯oInvokationEndIdx) +MacroTable::Substitution MacroTable::parseSubstitutionStatement(const QString &str, + int substitutionStartIdx, + int ¯oInvokationEndIdx) { macroInvokationEndIdx = -1; int equalsSignIdx = -1; @@ -360,11 +364,17 @@ void MacroTable::parseSubstitutionStatement(const QString &str, int substitution if (equalsSignIdx < 0 || macroInvokationEndIdx < 0) throw Exception(QLatin1String("Cannot find = after : in macro substitution.")); - QString before = str.mid(substitutionStartIdx, equalsSignIdx - substitutionStartIdx); - QString after = str.mid(equalsSignIdx + 1, macroInvokationEndIdx - equalsSignIdx - 1); + Substitution result; + result.before = str.mid(substitutionStartIdx, equalsSignIdx - substitutionStartIdx); + result.after = str.mid(equalsSignIdx + 1, macroInvokationEndIdx - equalsSignIdx - 1); for (int i=quotePositions.count() - 1; i >= 0; --i) - after.remove(quotePositions.at(i) - equalsSignIdx - 1, 1); - value.replace(before, after); + result.after.remove(quotePositions.at(i) - equalsSignIdx - 1, 1); + return result; +} + +void MacroTable::applySubstitution(const MacroTable::Substitution &substitution, QString &value) +{ + value.replace(substitution.before, substitution.after); } } // namespace NMakeFile diff --git a/src/jomlib/macrotable.h b/src/jomlib/macrotable.h index 1906ed9..443884f 100644 --- a/src/jomlib/macrotable.h +++ b/src/jomlib/macrotable.h @@ -48,7 +48,14 @@ public: QString expandMacros(const QString& str, bool inDependentsLine = false) const; void dump() const; - static void parseSubstitutionStatement(const QString &str, int substitutionStartIdx, QString &value, int ¯oInvokationEndIdx); + struct Substitution + { + QString before; + QString after; + }; + + static Substitution parseSubstitutionStatement(const QString &str, int substitutionStartIdx, int ¯oInvokationEndIdx); + static void applySubstitution(const Substitution &substitution, QString &value); private: struct MacroData diff --git a/src/jomlib/makefile.cpp b/src/jomlib/makefile.cpp index 286246d..15f65a8 100644 --- a/src/jomlib/makefile.cpp +++ b/src/jomlib/makefile.cpp @@ -239,7 +239,9 @@ void DescriptionBlock::expandFileNameMacros(QString& str, int depIdx, bool depen if (substitutionIdx > 0) { int macroInvokationEnd; - MacroTable::parseSubstitutionStatement(str, substitutionIdx, macroValue, macroInvokationEnd); + const MacroTable::Substitution substitution = + MacroTable::parseSubstitutionStatement(str, substitutionIdx, macroInvokationEnd); + MacroTable::applySubstitution(substitution, macroValue); replacementLength = macroInvokationEnd - idx - 2; // because we're later adding 4 } |