[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