]> AND Private Git Repository - blast.git/blobdiff - Parameters.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
added sources managment
[blast.git] / Parameters.cpp
index 46437c34bc0dcd1aa3cd36bca0ce9cf98379648f..c903f5d94be772d400ded37c64e1de0519b211b7 100644 (file)
@@ -574,10 +574,27 @@ void Parameters::loadBlastConfiguration(QString confFile) throw(Exception) {
     implPathes.append(path);\r
     cout << "impl path : " << qPrintable(path) << endl << endl;\r
   }\r
+\r
+  QDomElement eltSource = eltImpl.nextSiblingElement("sources");\r
+  nbPathesStr = eltSource.attribute("nb","none");\r
+  nbPathes = nbPathesStr.toInt(&ok);\r
+  QDomNodeList listSourceDir = eltSource.elementsByTagName("source_lib");\r
+  if ((!ok) || (nbPathes != listSourceDir.size())) throw(Exception(CONFIGFILE_CORRUPTED));\r
+\r
+  for(int i=0;i<listSourceDir.size();i++) {\r
+    QDomNode nodeSourceDir = listSourceDir.at(i);\r
+    QDomElement eltSourceDir = nodeSourceDir.toElement();\r
+    if (eltSourceDir.isNull()) throw(Exception(CONFIGFILE_CORRUPTED));\r
+    QString path = eltSourceDir.attribute("path","none");\r
+    if (path == "none") throw(Exception(CONFIGFILE_CORRUPTED));\r
+    sourcePathes.append(path);\r
+    cout << "core path : " << qPrintable(path) << endl << endl;\r
+  }\r
+\r
   // getting elt = the element <defaults>\r
   // for each child element, initialize the associated attributes of Parameters\r
 \r
-  QDomElement eltDefaults = eltImpl.nextSiblingElement("defaults");\r
+  QDomElement eltDefaults = eltSource.nextSiblingElement("defaults");\r
 \r
   QDomElement eltBlocks = eltDefaults.firstChildElement("blocks");\r
   QString attributeStr = eltBlocks.attribute("width", "none");\r
@@ -807,6 +824,22 @@ void Parameters::loadImplementationsFromXml() throw(Exception) {
       QString refXml = implRoot.attribute("ref_name","none");\r
       QString refMd5 = implRoot.attribute("ref_md5","none");\r
       BlockImplementation* impl = new BlockImplementation(fileName,refXml,refMd5);\r
+\r
+      QDomNodeList archNode = implRoot.elementsByTagName("architecture");\r
+\r
+      if (archNode.isEmpty()) {\r
+        cout << "impl has no architecture" << endl;\r
+        return;\r
+      }\r
+      QDomElement archElt = archNode.at(0).toElement();\r
+      QString compList = archElt.attribute("comp_list","none");\r
+      if (compList != "none") {\r
+        QStringList compos = compList.split(",");\r
+        foreach(QString s, compos) {\r
+          impl->addSource(s);\r
+        }\r
+      }\r
+\r
       try {\r
         impl->loadPatterns(implRoot);\r
       }\r
@@ -908,6 +941,64 @@ void Parameters::saveImplementationsToLib() throw(Exception) {
   libFile.close();\r
 \r
 }\r
+\r
+\r
+void Parameters::loadSources() throw(Exception) {\r
+\r
+  for(int i=0;i<sourcePathes.size();i++) {\r
+    cout << "analyzing " << qPrintable(sourcePathes.at(i)) << endl;\r
+    QDir dir(sourcePathes.at(i));\r
+    QStringList filter;\r
+    filter << "*.vhd";\r
+    dir.setNameFilters(filter);\r
+    QStringList list = dir.entryList();\r
+    for(int j=0;j<list.size();j++) {\r
+      QString fileName = dir.absolutePath();\r
+      fileName.append("/"+list.at(j));\r
+\r
+      cout << "parsing " << qPrintable(fileName) << " ... ";\r
+      QFile srcXML(fileName);\r
+      if (!srcXML.open(QIODevice::ReadOnly)) {\r
+        throw(Exception(IMPLFILE_NOACCESS));\r
+      }\r
+      QTextStream in(&srcXML);\r
+\r
+      QString line = in.readLine();\r
+      while (!line.isNull()) {\r
+        if (line.contains("package", Qt::CaseInsensitive)) {\r
+          QRegularExpression rxPack("^package (.+) is$",QRegularExpression::CaseInsensitiveOption);\r
+          QRegularExpressionMatch matchPack = rxPack.match(line);\r
+          if (matchPack.hasMatch()) {\r
+            QString packName = matchPack.captured(1);\r
+            cout << "found package " << qPrintable(packName) << endl;\r
+            availableSources.append(new ExternalSource(packName,fileName,ExternalSource::Package));\r
+          }\r
+        }\r
+        else if (line.contains("entity", Qt::CaseInsensitive)) {\r
+          QRegularExpression rxEnt("^entity (.+) is$",QRegularExpression::CaseInsensitiveOption);\r
+          QRegularExpressionMatch matchEnt = rxEnt.match(line);\r
+          if (matchEnt.hasMatch()) {\r
+            QString entityName = matchEnt.captured(1);\r
+            cout << "found entity " << qPrintable(entityName) << endl;\r
+            availableSources.append(new ExternalSource(entityName,fileName,ExternalSource::Code));\r
+          }\r
+        }\r
+        line = in.readLine();\r
+      }\r
+      srcXML.close();\r
+      cout << "OK" << endl;\r
+\r
+    }\r
+  }\r
+}\r
+\r
+ExternalSource* Parameters::searchSourceByName(const QString& name) {\r
+  foreach(ExternalSource* s, availableSources) {\r
+    if (s->getName() == name) return s;\r
+  }\r
+  return NULL;\r
+}\r
+\r
 void Parameters::addAvailableBlock(ReferenceBlock *block) {\r
   availableBlocks.append(block);\r
   foreach (int id,block->getCategories()) {\r