From 99a4a62977347654bee77513661df538c9ee4ab3 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Tue, 9 Sep 2014 15:16:27 +0200 Subject: QMakeGlobals::expandEnvVars: Make sane Use indexOf() to match individual characters, which is a lot faster than QRegExp. As a side effect, don't try to expand what we just inserted. Change-Id: I964fbd92055f2f2649e7d8ed5739cf1fc7cae927 Reviewed-by: Oswald Buddenhagen Reviewed-by: Daniel Teske (cherry picked from qtcreator/2cc17a61eb6d0fee80fd388fcc5be03a59e4f2b5) Reviewed-by: Joerg Bornemann --- qmake/library/qmakeglobals.cpp | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/qmake/library/qmakeglobals.cpp b/qmake/library/qmakeglobals.cpp index dd13b94d92..8bb5199519 100644 --- a/qmake/library/qmakeglobals.cpp +++ b/qmake/library/qmakeglobals.cpp @@ -74,27 +74,8 @@ QT_BEGIN_NAMESPACE #define fL1S(s) QString::fromLatin1(s) -namespace { // MSVC doesn't seem to know the semantics of "static" ... - -static struct { - QRegExp reg_variableName; -} statics; - -} - -static void initStatics() -{ - if (!statics.reg_variableName.isEmpty()) - return; - - statics.reg_variableName.setPattern(QLatin1String("\\$\\(.*\\)")); - statics.reg_variableName.setMinimal(true); -} - QMakeGlobals::QMakeGlobals() { - initStatics(); - do_cache = true; #ifdef PROEVALUATOR_DEBUG @@ -292,11 +273,24 @@ QStringList QMakeGlobals::getPathListEnv(const QString &var) const QString QMakeGlobals::expandEnvVars(const QString &str) const { QString string = str; - int rep; - QRegExp reg_variableName = statics.reg_variableName; // Copy for thread safety - while ((rep = reg_variableName.indexIn(string)) != -1) - string.replace(rep, reg_variableName.matchedLength(), - getEnv(string.mid(rep + 2, reg_variableName.matchedLength() - 3))); + int startIndex = 0; + forever { + startIndex = string.indexOf(QLatin1Char('$'), startIndex); + if (startIndex < 0) + break; + if (string.length() < startIndex + 3) + break; + if (string.at(startIndex + 1) != QLatin1Char('(')) { + startIndex++; + continue; + } + int endIndex = string.indexOf(QLatin1Char(')'), startIndex + 2); + if (endIndex < 0) + break; + QString value = getEnv(string.mid(startIndex + 2, endIndex - startIndex - 2)); + string.replace(startIndex, endIndex - startIndex + 1, value); + startIndex += value.length(); + } return string; } -- cgit v1.2.3