// QT includes #include #include #include #include #include // CTK includes #include // STD includes #include #include //---------------------------------------------------------------------------- QString help(const QString& progName) { QString msg = "Usage: %1 "; return msg.arg(progName); } //---------------------------------------------------------------------------- void displayError(const QString& progName, const QString& msg) { std::cerr << QString("%1\n%2\n%3\n").arg(progName). arg(msg). arg(help(progName)).toStdString(); } //---------------------------------------------------------------------------- int getOrGenerateId(QHash& vertexIdToLabel, QHash& vertexLabelToId, const QString& label) { // If needed, generate vertex id int vertexId = -1; if (!vertexLabelToId.keys().contains(label)) { vertexId = vertexLabelToId.keys().size() + 1; vertexLabelToId[label] = vertexId; vertexIdToLabel[vertexId] = label; } else { vertexId = vertexLabelToId[label]; } return vertexId; } //---------------------------------------------------------------------------- int main(int argc, char** argv) { bool verbose = false; // a graph file is expected if (argc < 2) { displayError(argv[0], QLatin1String("Missing one argument")); return EXIT_FAILURE; } QString filepath = QString::fromLatin1(argv[1]); if (!QFile::exists(filepath)) { displayError(argv[0], QString("File '%1' doesn't exists !").arg(filepath)); return EXIT_FAILURE; } QFile data(filepath); if (!data.open(QFile::ReadOnly)) { displayError(argv[0], QString("Failed to open file '%1' !").arg(filepath)); return EXIT_FAILURE; } QTextStream in(&data); QString header = in.readLine(); if (header.isNull()) { displayError(argv[0], QString("Failed to read Header line in file '%1' !").arg(filepath)); return EXIT_FAILURE; } // Regular expression to extract two integers QRegExp twoint_re("^([0-9]+)\\s+([0-9]+)"); // Extract numberOfVertices and numberOfEdges int pos = twoint_re.indexIn(header.trimmed()); if (pos != 0) { displayError(argv[0], QString("Error in file '%1' - First line should look like: <#Vertices> <#Edges>") .arg(filepath)); return EXIT_FAILURE; } QStringList list = twoint_re.capturedTexts(); Q_ASSERT(list.size() == 3); int numberOfVertices = list[1].toInt(); int numberOfEdges = list[2].toInt(); if (verbose) { qDebug() << "#Vertices:" << numberOfVertices << "#Edges:" << numberOfEdges; } // Init ctkDependencyGraph mygraph(numberOfVertices, numberOfEdges); mygraph.setVerbose(verbose); // Map between vertex label and vertex id QHash vertexIdToLabel; QHash vertexLabelToId; // Regular expression to extract two label QRegExp twolabel_re("^(.+)\\s+(.+)"); // Read vertex connection int lineNumber = 2; QString line = in.readLine(); do { // Skip empty line or commented line if (line.isEmpty() || line.startsWith("#")) { continue; } // Extract vertex points int pos = twolabel_re.indexIn(line.trimmed()); if (pos != 0) { displayError(argv[0], QString("Error in file '%1' - line:%2 - Expected format is: