summaryrefslogtreecommitdiff
path: root/log.cpp
diff options
context:
space:
mode:
authorRusty Wagner <dontpanic@binaryninja.com>2015-03-03 16:43:50 -0500
committerRusty Wagner <dontpanic@binaryninja.com>2015-03-03 16:43:50 -0500
commit512ebc2ac144111702171d7ac8c6a1eb2d25b650 (patch)
tree67ccfb90b837d87e7a9a640204eccc55881d7232 /log.cpp
parentea4cfdfef205194674fa9cb1beda4eaa56fd1fb8 (diff)
Add a logging system
Diffstat (limited to 'log.cpp')
-rw-r--r--log.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/log.cpp b/log.cpp
new file mode 100644
index 00000000..941414e5
--- /dev/null
+++ b/log.cpp
@@ -0,0 +1,135 @@
+#define _CRT_SECURE_NO_WARNINGS
+#include <stdarg.h>
+#include <stdio.h>
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+void LogListener::LogMessageCallback(void* ctxt, BNLogLevel level, const char* msg)
+{
+ LogListener* listener = (LogListener*)ctxt;
+ listener->LogMessage(level, msg);
+}
+
+
+void LogListener::CloseLogCallback(void* ctxt)
+{
+ LogListener* listener = (LogListener*)ctxt;
+ listener->CloseLog();
+}
+
+
+void LogListener::RegisterLogListener(LogListener* listener)
+{
+ BNLogListener callbacks;
+ callbacks.context = listener;
+ callbacks.log = LogMessageCallback;
+ callbacks.close = CloseLogCallback;
+ BNRegisterLogListener(&callbacks);
+}
+
+
+void LogListener::UnregisterLogListener(LogListener* listener)
+{
+ BNLogListener callbacks;
+ callbacks.context = listener;
+ callbacks.log = LogMessageCallback;
+ callbacks.close = CloseLogCallback;
+ BNUnregisterLogListener(&callbacks);
+}
+
+
+static void PerformLog(BNLogLevel level, const char* fmt, va_list args)
+{
+#if defined(_MSC_VER)
+ int len = _vscprintf(fmt, args);
+ if (len < 0)
+ return;
+ char* msg = malloc(len + 1);
+ if (!msg)
+ return;
+ if (vsnprintf(msg, len + 1, fmt, args) >= 0)
+ BNLog(level, "%s", msg);
+ free(msg);
+#else
+ char* msg;
+ if (vasprintf(&msg, fmt, args) < 0)
+ return;
+ BNLog(level, "%s", msg);
+ free(msg);
+#endif
+}
+
+
+void BinaryNinja::Log(BNLogLevel level, const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(level, fmt, args);
+}
+
+
+void BinaryNinja::LogDebug(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(DebugLog, fmt, args);
+}
+
+
+void BinaryNinja::LogInfo(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(InfoLog, fmt, args);
+}
+
+
+void BinaryNinja::LogWarn(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(WarningLog, fmt, args);
+}
+
+
+void BinaryNinja::LogError(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(ErrorLog, fmt, args);
+}
+
+
+void BinaryNinja::LogAlert(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ PerformLog(AlertLog, fmt, args);
+}
+
+
+void BinaryNinja::LogToStdout(BNLogLevel minimumLevel)
+{
+ BNLogToStdout(minimumLevel);
+}
+
+
+void BinaryNinja::LogToStderr(BNLogLevel minimumLevel)
+{
+ BNLogToStderr(minimumLevel);
+}
+
+
+bool BinaryNinja::LogToFile(BNLogLevel minimumLevel, const string& path, bool append)
+{
+ return BNLogToFile(minimumLevel, path.c_str(), append);
+}
+
+
+void BinaryNinja::CloseLogs()
+{
+ BNCloseLogs();
+}