summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-01-02 19:09:46 +0100
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-01-02 19:27:14 +0100
commit39c04c9b9b5ed5b23d8410d22296c67be54dbef0 (patch)
treee4c0c896b223447279226456cd58b89b25d74f57
parent95150aae29d1660c36e96d22b87b84c1120733db (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.cpp24
-rw-r--r--src/jomlib/macrotable.h9
-rw-r--r--src/jomlib/makefile.cpp4
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 &macroInvokationEndIdx)
+MacroTable::Substitution MacroTable::parseSubstitutionStatement(const QString &str,
+ int substitutionStartIdx,
+ int &macroInvokationEndIdx)
{
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 &macroInvokationEndIdx);
+ struct Substitution
+ {
+ QString before;
+ QString after;
+ };
+
+ static Substitution parseSubstitutionStatement(const QString &str, int substitutionStartIdx, int &macroInvokationEndIdx);
+ 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
}