*******************************************************************************/
-#include <cstdarg>
-#include <cstdio> // snprintf
-#include <cstring> // strcpy
+#include <fstream>
#include "Log.hh"
#include "Script.hh"
namespace Mf {
-static LogLevel logLevel_ = LOG_WARNING;
-
-inline void printLog_(int logLevel, const char* fmt, va_list args)
-{
- if (logLevel_ < logLevel) return;
-
- switch (logLevel)
- {
- case LOG_ERROR:
- fprintf(stderr, " error: ");
- break;
- case LOG_WARNING:
- fprintf(stderr, "warning: ");
- break;
- case LOG_SCRIPT:
- fprintf(stderr, " script: ");
- break;
- case LOG_INFO:
- fprintf(stderr, " info: ");
- break;
- case LOG_DEBUG:
- fprintf(stderr, " debug: ");
- break;
- }
-
- vfprintf(stderr, fmt, args);
- fprintf(stderr, "\n");
-}
+Log::Level Log::gLevel = Log::WARNING;
-LogLevel setLogLevel(LogLevel level)
+void Log::setLevel(Level level)
{
- if (level != 0)
- logLevel_ = level;
-
- return logLevel_;
+ if (level != 0) gLevel = level;
}
-
-void logError(const char* fmt, ...)
+Log::Level Log::getLevel()
{
- va_list args;
- va_start(args, fmt);
-
- printLog_(LOG_ERROR, fmt, args);
-
- va_end(args);
+ return gLevel;
}
-void logWarning(const char* fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- printLog_(LOG_WARNING, fmt, args);
+static std::ofstream nullLog_;
- va_end(args);
-}
+std::ostream& log(std::clog);
+std::ostream& nullLog(nullLog_);
-void logInfo(const char* fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
-
- printLog_(LOG_INFO, fmt, args);
-
- va_end(args);
-}
-
-void logDebug(const char* fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
+Log logError(Log::ERRORR, " error: ");
+Log logWarning(Log::WARNING, "warning: ");
+Log logInfo(Log::INFO, " info: ");
- printLog_(LOG_DEBUG, fmt, args);
- va_end(args);
-}
-
-static void logScript(const char* fmt, ...)
+static int logScript_(Script& script, Log::Level level)
{
- va_list args;
- va_start(args, fmt);
-
- printLog_(LOG_SCRIPT, fmt, args);
+ static Log* logs[] = {0, &logError, &logWarning, &logInfo};
- va_end(args);
-}
-
-int logScript(Script& script)
-{
- Script::Value param = script[1];
+ Script::Slot param = script[1];
while (!param.isNone())
{
- if (param.isString())
- {
- std::string str;
- param.get(str);
- logScript("%s", str.c_str());
- }
- else if (param.isBoolean())
- {
- if (param) logScript("true");
- else logScript("false");
-
- }
- else if (param.isNil())
- {
- logScript("nil");
- }
- else
- {
- logScript("%s (%X)", param.getTypeName().c_str(),
- param.getIdentifier());
- }
-
- param.index++;
+ (*logs[level])(param);
+ ++param.index;
}
return 0;
}
-void importLogScript(Script& script)
+void importLogFunctions(Script& script)
{
- script.importFunction("print", (int (*)(Script&))logScript);
+ script.importFunction("LogError", boost::bind(logScript_, _1, Log::ERRORR));
+ script.importFunction("LogWarning", boost::bind(logScript_, _1, Log::WARNING));
+ script.importFunction("LogInfo", boost::bind(logScript_, _1, Log::INFO));
+ script.importFunction("print", boost::bind(logScript_, _1, Log::INFO));
}