[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdevelop/buildtools/managers/cmake/parser
From: Aleix Pol Gonzalez <aleixpol () gmail ! com>
Date: 2007-12-31 20:16:52
Message-ID: 1199132212.265122.28215.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 755255 by apol:
New, simpler, algorithm to find variables in cmake strings, which should be (and \
seems to be) much faster than the old one. :)
M +28 -40 cmakeprojectvisitor.cpp
M +2 -2 cmakeprojectvisitor.h
--- trunk/KDE/kdevelop/buildtools/managers/cmake/parser/cmakeprojectvisitor.cpp \
#755254:755255 @@ -61,54 +61,40 @@
return env;
}
-CMakeProjectVisitor::VariableType CMakeProjectVisitor::hasVariable(const QString \
&name) +QString CMakeProjectVisitor::variableName(const QString &exp, VariableType \
&type) {
- int CMakeIdx=name.indexOf ( "${" ), envIdx=name.indexOf ( "$ENV{" );
-
- if ( CMakeIdx<0 && envIdx<0 )
- return NoVar;
- else if ( envIdx>=0 )
- return ENV;
- else if ( CMakeIdx>=0 )
- return CMake;
-
- return NoVar;
-}
-
-QString CMakeProjectVisitor::variableName(const QString &name, const VariableType \
type)
-{
- QString exp;
-
- switch(type) {
- case NoVar:
- return QString();
- case CMake:
- exp=VariableMap::regexVar();
- break;
- case ENV:
- exp=VariableMap::regexEnvVar();
- break;
+ QString name;
+ type=NoVar;
+ const int count=exp.count();
+ bool done=false;
+ int prev=-1;
+ for(int i=0; i<count && !done; i++)
+ {
+ if(exp[i]=='{')
+ prev=i;
+ if(exp[i]=='}' && i>0 && prev>0) {
+ if(exp[prev-1]=='$') {
+ name = exp.mid(prev+1, i-prev-1);
+ type=CMake;
+ done=true;
+ } else if(exp.mid(prev-4,4)=="$ENV") {
+ name = exp.mid(prev+1, i-prev-1);
+ type=ENV;
+ done=true;
+ }
+ }
}
- QRegExp rx(exp);
- int idx = rx.indexIn(name);
- if(idx<0) {
- kDebug(9042) << "error!!! I can't know that it is a variable:" << name << ". \
Report this bug, please.";
- return "";
- }
- int begin=name.indexOf('{', idx)+1;
- int end=name.indexOf('}', begin);
-
- kDebug(9042) << "resolving variable to name:" << name.mid(begin, end-begin);
- return name.mid(begin, end-begin);
+ return name;
}
QStringList CMakeProjectVisitor::resolveVariable(const QString &exp, const \
VariableMap *values) {
- VariableType type=hasVariable(exp);
+ VariableType type;
+ QString var = variableName(exp, type);
+
if(type)
{
QStringList ret;
- QString var = variableName(exp, type);
if(type==ENV)
{
foreach(QString s, envVarDirectories(var))
@@ -1223,7 +1209,9 @@
foreach(CMakeFunctionArgument arg, exp.arguments)
{
- if(hasVariable(arg.value))
+ VariableType t;
+ variableName(arg.value, t);
+ if(t)
{
ret.addArguments(resolveVariable(arg.value, vars));
}
--- trunk/KDE/kdevelop/buildtools/managers/cmake/parser/cmakeprojectvisitor.h \
#755254:755255 @@ -91,8 +91,8 @@
int walk(const CMakeFileContent& fc, int line);
enum VariableType { NoVar, CMake, ENV };
- static VariableType hasVariable(const QString &name);
- static QString variableName(const QString &name, const VariableType isEnv);
+// static VariableType hasVariable(const QString &name);
+ static QString variableName(const QString &name, VariableType &isEnv);
static QStringList resolveVariable(const QString &exp, const VariableMap \
*values);
static CMakeFunctionDesc resolveVariables(const CMakeFunctionDesc &exp, \
const VariableMap *values); static QStringList envVarDirectories(const QString \
&varName);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic