#include "mujikoma-common.h"
#include "Log.h"
+#include "log/StdLog.h"
#include <cstdarg>
+#include <dlfcn.h>
namespace MUJIKOMA_NAMESPACE {
+using namespace log;
+
//
// Public
//
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);
}
//
//
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();
}
}
using namespace std;
+class LogModule;
+
class Log {
public:
static Log& instance();
void log(level lv, const char* format, ...);
private:
+ void *lib;
+ LogModule *mod;
+
Log();
};
--- /dev/null
+#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__
+
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)
namespace MUJIKOMA_NAMESPACE {
+//
+// Public
+//
+
+MujiKoma::MujiKoma()
+: alive(0)
+{
+}
+
+MujiKoma::~MujiKoma()
+{
+}
+
void MujiKoma::start()
{
DLOG("MujiKoma::start() %d", alive);
class MujiKoma {
public:
+ MujiKoma();
+ ~MujiKoma();
void start();
void stop();
--- /dev/null
+CXX = g++
+CXXFLAGS = -Wall -I../
+OBJS = StdLog.o
+PROG = libStdLog.so
+
+$(PROG) : $(OBJS)
+ $(CXX) $(CXXFLAGS) -shared $(OBJS) -o $(PROG)
+
+clean :
+ rm -f $(OBJS) $(PROG)
--- /dev/null
+#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
+
--- /dev/null
+#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__
+
koma = new MujiKoma();
koma->start();
+ delete koma;
return 0;
}