OSDN Git Service

Add LogModule master
authormomen <momen@users.sourceforge.jp>
Thu, 20 Jan 2011 12:32:05 +0000 (21:32 +0900)
committermomen <momen@users.sourceforge.jp>
Thu, 20 Jan 2011 12:32:05 +0000 (21:32 +0900)
Log.cpp
Log.h
LogModule.h [new file with mode: 0644]
Makefile
MujiKoma.cpp
MujiKoma.h
log/Makefile [new file with mode: 0644]
log/StdLog.cpp [new file with mode: 0644]
log/StdLog.h [new file with mode: 0644]
main.cpp

diff --git a/Log.cpp b/Log.cpp
index 67fe3db..612937b 100644 (file)
--- a/Log.cpp
+++ b/Log.cpp
@@ -1,10 +1,14 @@
 #include "mujikoma-common.h"
 #include "Log.h"
+#include "log/StdLog.h"
 
 #include <cstdarg>
+#include <dlfcn.h>
 
 namespace MUJIKOMA_NAMESPACE {
 
+using namespace log;
+
 //
 // Public
 //
@@ -17,19 +21,32 @@ Log& Log::instance()
 
 Log::~Log()
 {
+       if (lib) {
+               if (mod) {
+                       destroy_t* destroy_mod
+                               = (destroy_t*)dlsym(lib, "destroy_StdLog");
+                       destroy_mod(mod);
+                       mod = 0;
+               }
+               dlclose(lib);
+               lib = 0;
+       }
 }
 
 void Log::log(level lv, const char* format, ...)
 {
-       va_list va;
-       char buf[4096];
+       if (!mod) {
+               return;
+       }
 
+       va_list va;
        va_start(va, format);
-       vsnprintf(buf, sizeof(buf)-1, format, va);
-       va_end(va);
 
-       printf("%s", buf);
-       fflush(stdout);
+       //StdLog std;
+       //std.log(lv, format, va);
+       mod->log(lv, format, va);
+
+       va_end(va);
 }
 
 //
@@ -37,7 +54,17 @@ void Log::log(level lv, const char* format, ...)
 //
 
 Log::Log()
+: lib(0), mod(0)
 {
+       lib = dlopen("libStdLog.so", RTLD_LAZY);
+       if (!lib) {
+               return;
+       }
+       create_t* create_mod = (create_t*)dlsym(lib, "create_StdLog");
+       if (!create_mod) {
+               return;
+       }
+       mod = create_mod();
 }
 
 }
diff --git a/Log.h b/Log.h
index c3c438c..c222cb2 100644 (file)
--- a/Log.h
+++ b/Log.h
@@ -7,6 +7,8 @@ namespace MUJIKOMA_NAMESPACE {
 
 using namespace std;
 
+class LogModule;
+
 class Log {
 public:
        static Log& instance();
@@ -22,6 +24,9 @@ public:
        void log(level lv, const char* format, ...);
 
 private:
+       void *lib;
+       LogModule *mod;
+
        Log();
 };
 
diff --git a/LogModule.h b/LogModule.h
new file mode 100644 (file)
index 0000000..31c3546
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __MUJIKOMA_LOG_MODULE_H__
+#define __MUJIKOMA_LOG_MODULE_H__
+
+#include "mujikoma-common.h"
+#include "Log.h"
+
+namespace MUJIKOMA_NAMESPACE {
+
+class LogModule {
+public:
+       virtual void log(Log::level lv, const char* format, va_list& list) = 0;
+};
+
+typedef LogModule* create_t();
+typedef void destroy_t(LogModule*);
+
+}
+
+#endif // __MUJIKOMA_LOG_MODULE_H__
+
index 5ebad6f..f6fa8d1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,13 @@
 PROG = mujikoma
 CXX = g++
 CXXFLAGS = -Wall
+LDFLAGS = -ldl #-Llog -lStdLog
 OBJS = main.o \
        MujiKoma.o \
        Log.o
 
 $(PROG) : $(OBJS)
-       $(CXX) $(CXXFLAGS) -o $(PROG) $(OBJS)
+       $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(PROG) $(OBJS)
 
 clean :
        rm -f $(OBJS) $(PROG)
index cd20deb..542fbcd 100644 (file)
@@ -2,6 +2,19 @@
 
 namespace MUJIKOMA_NAMESPACE {
 
+//
+// Public
+//
+
+MujiKoma::MujiKoma()
+: alive(0)
+{
+}
+
+MujiKoma::~MujiKoma()
+{
+}
+
 void MujiKoma::start()
 {
        DLOG("MujiKoma::start() %d", alive);
index 7d8671c..ac95ff6 100644 (file)
@@ -10,6 +10,8 @@ class Log;
 
 class MujiKoma {
 public:
+       MujiKoma();
+       ~MujiKoma();
        void start();
        void stop();
 
diff --git a/log/Makefile b/log/Makefile
new file mode 100644 (file)
index 0000000..cb4e251
--- /dev/null
@@ -0,0 +1,10 @@
+CXX = g++
+CXXFLAGS = -Wall -I../
+OBJS = StdLog.o
+PROG = libStdLog.so
+
+$(PROG) : $(OBJS)
+       $(CXX) $(CXXFLAGS) -shared $(OBJS)  -o $(PROG)
+
+clean :
+       rm -f $(OBJS) $(PROG)
diff --git a/log/StdLog.cpp b/log/StdLog.cpp
new file mode 100644 (file)
index 0000000..802d245
--- /dev/null
@@ -0,0 +1,41 @@
+#include "mujikoma-common.h"
+#include "StdLog.h"
+
+#include <cstdarg>
+
+namespace MUJIKOMA_NAMESPACE {
+namespace log {
+
+StdLog::StdLog()
+{
+}
+
+StdLog::~StdLog()
+{
+}
+
+void StdLog::log(Log::level lv, const char* format, va_list& list)
+{
+       //va_list va;
+       char buf[4096];
+
+       //va_start(va, format);
+       vsnprintf(buf, sizeof(buf)-1, format, list);
+       //va_end(va);
+
+       printf("%s", buf);
+       fflush(stdout);
+}
+
+} // log
+
+extern "C" LogModule* create_StdLog() {
+       return new log::StdLog;
+}
+
+extern "C" void destroy_StdLog(LogModule* p) {
+       delete p;
+}
+
+} // MUJIKOMA_NAMESPACE
+
diff --git a/log/StdLog.h b/log/StdLog.h
new file mode 100644 (file)
index 0000000..2452b4e
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef __MUJIKOMA_STD_LOG_H__
+#define __MUJIKOMA_STD_LOG_H__
+
+#include "../mujikoma-common.h"
+#include "../Log.h"
+#include "../LogModule.h"
+
+namespace MUJIKOMA_NAMESPACE {
+namespace log {
+
+class StdLog : public LogModule {
+public:
+       StdLog();
+       ~StdLog();
+       virtual void log(Log::level lv, const char* format, va_list& list);
+};
+
+}
+}
+
+#endif // __MUJIKOMA_STD_LOG_H__
+
index 34386c2..75a1336 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -56,6 +56,7 @@ int main(int argc, char** argv)
 
        koma = new MujiKoma();
        koma->start();
+       delete koma;
 
        return 0;
 }