diff --git a/src/Cutter.cpp b/src/Cutter.cpp
index 43831703..634a38cf 100644
--- a/src/Cutter.cpp
+++ b/src/Cutter.cpp
@@ -167,6 +167,10 @@ CutterCore::CutterCore(QObject *parent) :
// Otherwise r2 may ask the user for input and Cutter would freeze
setConfig("scr.interactive", false);
+ // Initialize graph node highlighter
+ bbHighlighter = new BasicBlockHighlighter();
+
+ // Initialize Async tasks manager
asyncTaskManager = new AsyncTaskManager(this);
}
@@ -231,6 +235,7 @@ bool CutterCore::sdbSet(QString path, QString key, QString val)
CutterCore::~CutterCore()
{
+ delete bbHighlighter;
r_core_free(this->core_);
r_cons_free();
}
@@ -2628,3 +2633,8 @@ QString CutterCore::ansiEscapeToHtml(const QString &text)
free(html);
return r;
}
+
+BasicBlockHighlighter* CutterCore::getBBHighlighter()
+{
+ return bbHighlighter;
+}
diff --git a/src/Cutter.h b/src/Cutter.h
index 6781814b..ae7f4fae 100644
--- a/src/Cutter.h
+++ b/src/Cutter.h
@@ -46,6 +46,7 @@ typedef ut64 RVA;
class AsyncTaskManager;
class CutterCore;
#include "plugins/CutterPlugin.h"
+#include "common/BasicBlockHighlighter.h"
class RCoreLocked
{
@@ -728,6 +729,7 @@ public:
RCoreLocked core() const;
static QString ansiEscapeToHtml(const QString &text);
+ BasicBlockHighlighter *getBBHighlighter();
signals:
void refreshAll();
@@ -783,6 +785,7 @@ private:
QErrorMessage msgBox;
bool emptyGraph = false;
+ BasicBlockHighlighter *bbHighlighter;
};
diff --git a/src/Cutter.pro b/src/Cutter.pro
index 3df480c0..8013cb93 100644
--- a/src/Cutter.pro
+++ b/src/Cutter.pro
@@ -298,7 +298,8 @@ SOURCES += \
dialogs/LoadNewTypesDialog.cpp \
widgets/SdbWidget.cpp \
common/PythonManager.cpp \
- plugins/PluginManager.cpp
+ plugins/PluginManager.cpp \
+ common/BasicBlockHighlighter.cpp
HEADERS += \
Cutter.h \
@@ -411,7 +412,8 @@ HEADERS += \
dialogs/LoadNewTypesDialog.h \
widgets/SdbWidget.h \
common/PythonManager.h \
- plugins/PluginManager.h
+ plugins/PluginManager.h \
+ common/BasicBlockHighlighter.h
FORMS += \
dialogs/AboutDialog.ui \
diff --git a/src/bindings/bindings.xml b/src/bindings/bindings.xml
index cbd8fe44..d26c061c 100644
--- a/src/bindings/bindings.xml
+++ b/src/bindings/bindings.xml
@@ -7,6 +7,7 @@
+
@@ -102,4 +103,4 @@
-
\ No newline at end of file
+
diff --git a/src/common/BasicBlockHighlighter.cpp b/src/common/BasicBlockHighlighter.cpp
new file mode 100644
index 00000000..e8565d12
--- /dev/null
+++ b/src/common/BasicBlockHighlighter.cpp
@@ -0,0 +1,48 @@
+#include "BasicBlockHighlighter.h"
+
+BasicBlockHighlighter::BasicBlockHighlighter()
+{
+}
+
+BasicBlockHighlighter::~BasicBlockHighlighter()
+{
+ for (BasicBlockIt itr = bbMap.begin(); itr != bbMap.end(); itr++) {
+ delete itr->second;
+ }
+}
+
+/*!
+ * \brief Highlight the basic block at address
+ */
+void BasicBlockHighlighter::highlight(RVA address, const QColor &color)
+{
+ BasicBlock *block = new BasicBlock;
+ block->address = address;
+ block->color = color;
+ bbMap[address] = block;
+}
+
+/*!
+ * \brief Clear the basic block highlighting
+ */
+void BasicBlockHighlighter::clear(RVA address)
+{
+ bbMap.erase(address);
+}
+
+/*!
+ * \brief Return a highlighted basic block
+ *
+ * If there is nothing to highlight at specified address, returns nullptr
+ */
+BasicBlock *BasicBlockHighlighter::getBasicBlock(RVA address)
+{
+ BasicBlockIt it;
+
+ it = bbMap.find(address);
+ if (it != bbMap.end()) {
+ return it->second;
+ }
+
+ return nullptr;
+}
diff --git a/src/common/BasicBlockHighlighter.h b/src/common/BasicBlockHighlighter.h
new file mode 100644
index 00000000..53f44032
--- /dev/null
+++ b/src/common/BasicBlockHighlighter.h
@@ -0,0 +1,30 @@
+#ifndef BASICKBLOCKHIGHLIGHTER_H
+#define BASICKBLOCKHIGHLIGHTER_H
+
+class BasicBlockHighlighter;
+
+#include "Cutter.h"
+#include