Logger.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "Base.h"
  2. #include "Game.h"
  3. #include "ScriptController.h"
  4. namespace gameplay
  5. {
  6. Logger::State Logger::_state[3];
  7. Logger::State::State() : logFunctionC(NULL), logFunctionLua(NULL), enabled(true)
  8. {
  9. }
  10. Logger::Logger()
  11. {
  12. }
  13. Logger::~Logger()
  14. {
  15. }
  16. void Logger::log(Level level, const char* message, ...)
  17. {
  18. State& state = _state[level];
  19. if (!state.enabled)
  20. return;
  21. // Declare a moderately sized buffer on the stack that should be
  22. // large enough to accommodate most log requests.
  23. int size = 1024;
  24. char stackBuffer[1024];
  25. std::vector<char> dynamicBuffer;
  26. char* str = stackBuffer;
  27. for ( ; ; )
  28. {
  29. va_list args;
  30. va_start(args, message);
  31. // Pass one less than size to leave room for NULL terminator
  32. int needed = vsnprintf(str, size-1, message, args);
  33. // NOTE: Some platforms return -1 when vsnprintf runs out of room, while others return
  34. // the number of characters actually needed to fill the buffer.
  35. if (needed >= 0 && needed < size)
  36. {
  37. // Successfully wrote buffer. Added a NULL terminator in case it wasn't written.
  38. str[needed] = '\0';
  39. va_end(args);
  40. break;
  41. }
  42. size = needed > 0 ? (needed + 1) : (size * 2);
  43. dynamicBuffer.resize(size);
  44. str = &dynamicBuffer[0];
  45. va_end(args);
  46. }
  47. if (state.logFunctionC)
  48. {
  49. // Pass call to registered C log function
  50. (*state.logFunctionC)(level, str);
  51. }
  52. else if (state.logFunctionLua)
  53. {
  54. // Pass call to registered Lua log function
  55. Game::getInstance()->getScriptController()->executeFunction<void>(state.logFunctionLua, "[Logger::Level]s", level, str);
  56. }
  57. else
  58. {
  59. // Log to the default output
  60. gameplay::print("%s", str);
  61. }
  62. }
  63. bool Logger::isEnabled(Level level)
  64. {
  65. return _state[level].enabled;
  66. }
  67. void Logger::setEnabled(Level level, bool enabled)
  68. {
  69. _state[level].enabled = enabled;
  70. }
  71. void Logger::set(Level level, void (*logFunction) (Level, const char*))
  72. {
  73. State& state = _state[level];
  74. state.logFunctionC = logFunction;
  75. state.logFunctionLua = NULL;
  76. }
  77. void Logger::set(Level level, const char* logFunction)
  78. {
  79. State& state = _state[level];
  80. state.logFunctionLua = logFunction;
  81. state.logFunctionC = NULL;
  82. }
  83. }