diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-04-03 17:11:36 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-05-05 18:41:27 +0200 |
commit | a1947aeffe158a0ea7de3ced1bf8d6a4719a27ef (patch) | |
tree | c1b249b7d8bd9b3079df3ad5fe468f7ff4df861b /qmake/library/qmakebuiltins.cpp | |
parent | 412dd857b81471277e1014b6329f46a389a42cb3 (diff) |
Port qmake over to user QRegularExpression
Use the DotMatchesEverythingOption for all places
where we interpret .pro files, to increase compatibility
with QRegExp.
Change-Id: I347d6b17858069f3c9cedcedd04df58358d83f27
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'qmake/library/qmakebuiltins.cpp')
-rw-r--r-- | qmake/library/qmakebuiltins.cpp | 72 |
1 files changed, 47 insertions, 25 deletions
diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp index 460720168f..96583e5e76 100644 --- a/qmake/library/qmakebuiltins.cpp +++ b/qmake/library/qmakebuiltins.cpp @@ -39,7 +39,7 @@ #include <qfile.h> #include <qfileinfo.h> #include <qlist.h> -#include <qregexp.h> +#include <qregularexpression.h> #include <qset.h> #include <qstringlist.h> #include <qtextstream.h> @@ -639,7 +639,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( if (!var.isEmpty()) { const auto strings = values(map(var)); if (regexp) { - QRegExp sepRx(sep); + QRegularExpression sepRx(sep, QRegularExpression::DotMatchesEverythingOption); + if (!sepRx.isValid()) { + evalError(fL1S("section(): Encountered invalid regular expression '%1'.").arg(sep)); + goto allfail; + } for (const ProString &str : strings) { ProStringRwUser u1(str, m_tmp[m_toggle ^= 1]); ret << u1.extract(u1.str().section(sepRx, beg, end)); @@ -890,11 +894,15 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( m_valuemapStack.top()[ret.at(0).toKey()] = lst; break; } case E_FIND: { - QRegExp regx(args.at(1).toQString()); + QRegularExpression regx(args.at(1).toQString(), QRegularExpression::DotMatchesEverythingOption); + if (!regx.isValid()) { + evalError(fL1S("find(): Encountered invalid regular expression '%1'.").arg(regx.pattern())); + goto allfail; + } const auto vals = values(map(args.at(0))); for (const ProString &val : vals) { ProStringRoUser u1(val, m_tmp[m_toggle ^= 1]); - if (regx.indexIn(u1.str()) != -1) + if (u1.str().contains(regx)) ret += val; } break; @@ -990,7 +998,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( case E_RE_ESCAPE: for (int i = 0; i < args.size(); ++i) { ProStringRwUser u1(args.at(i), m_tmp1); - ret << u1.extract(QRegExp::escape(u1.str())); + ret << u1.extract(QRegularExpression::escape(u1.str())); } break; case E_VAL_ESCAPE: { @@ -1038,8 +1046,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( dirs.append(QString()); } - r.detach(); // Keep m_tmp out of QRegExp's cache - QRegExp regex(r, Qt::CaseSensitive, QRegExp::Wildcard); + QString pattern = QRegularExpression::wildcardToRegularExpression(r); + QRegularExpression regex(pattern, QRegularExpression::DotMatchesEverythingOption); + if (!regex.isValid()) { + evalError(fL1S("section(): Encountered invalid wildcard expression '%1'.").arg(pattern)); + goto allfail; + } for (int d = 0; d < dirs.count(); d++) { QString dir = dirs[d]; QDir qdir(pfx + dir); @@ -1051,7 +1063,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( if (recursive) dirs.append(fname + QLatin1Char('/')); } - if (regex.exactMatch(qdir[i])) + if (regex.match(qdir[i]).hasMatch()) ret += ProString(fname).setSource(currentFileId()); } } @@ -1086,7 +1098,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand( } #endif case E_REPLACE: { - const QRegExp before(args.at(1).toQString()); + const QRegularExpression before(args.at(1).toQString(), QRegularExpression::DotMatchesEverythingOption); + if (!before.isValid()) { + evalError(fL1S("replace(): Encountered invalid regular expression '%1'.").arg(before.pattern())); + goto allfail; + } ProStringRwUser u2(args.at(2), m_tmp2); const QString &after = u2.str(); const auto vals = values(map(args.at(0))); @@ -1528,21 +1544,24 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( return ok; if (args.count() == 2) return returnBool(vars.contains(map(args.at(1)))); - QRegExp regx; + QRegularExpression regx; + regx.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); ProStringRoUser u1(args.at(2), m_tmp1); const QString &qry = u1.str(); - if (qry != QRegExp::escape(qry)) { - QString copy = qry; - copy.detach(); - regx.setPattern(copy); + if (qry != QRegularExpression::escape(qry)) { + regx.setPattern(QRegularExpression::anchoredPattern(qry)); + if (!regx.isValid()) { + evalError(fL1S("infile(): Encountered invalid regular expression '%1'.").arg(qry)); + return ReturnFalse; + } } const auto strings = vars.value(map(args.at(1))); for (const ProString &s : strings) { if (s == qry) return ReturnTrue; - if (!regx.isEmpty()) { + if (!regx.pattern().isEmpty()) { ProStringRoUser u2(s, m_tmp[m_toggle ^= 1]); - if (regx.exactMatch(u2.str())) + if (regx.match(u2.str()).hasMatch()) return ReturnTrue; } } @@ -1590,11 +1609,14 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( case T_CONTAINS: { ProStringRoUser u1(args.at(1), m_tmp1); const QString &qry = u1.str(); - QRegExp regx; - if (qry != QRegExp::escape(qry)) { - QString copy = qry; - copy.detach(); - regx.setPattern(copy); + QRegularExpression regx; + regx.setPatternOptions(QRegularExpression::DotMatchesEverythingOption); + if (qry != QRegularExpression::escape(qry)) { + regx.setPattern(QRegularExpression::anchoredPattern(qry)); + if (!regx.isValid()) { + evalError(fL1S("contains(): Encountered invalid regular expression '%1'.").arg(qry)); + return ReturnFalse; + } } const ProStringList &l = values(map(args.at(0))); if (args.count() == 2) { @@ -1602,9 +1624,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( const ProString &val = l[i]; if (val == qry) return ReturnTrue; - if (!regx.isEmpty()) { + if (!regx.pattern().isEmpty()) { ProStringRoUser u2(val, m_tmp[m_toggle ^= 1]); - if (regx.exactMatch(u2.str())) + if (regx.match(u2.str()).hasMatch()) return ReturnTrue; } } @@ -1617,9 +1639,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( if (val.toQStringRef() == mutuals[mut].trimmed()) { if (val == qry) return ReturnTrue; - if (!regx.isEmpty()) { + if (!regx.pattern().isEmpty()) { ProStringRoUser u2(val, m_tmp[m_toggle ^= 1]); - if (regx.exactMatch(u2.str())) + if (regx.match(u2.str()).hasMatch()) return ReturnTrue; } return ReturnFalse; |