Logger.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. va_list args;
  22. va_start(args, message);
  23. // Declare a moderately sized buffer on the stack that should be
  24. // large enough to accommodate most log requests.
  25. int size = 1024;
  26. char stackBuffer[1024];
  27. std::vector<char> dynamicBuffer;
  28. char* str = stackBuffer;
  29. for ( ; ; )
  30. {
  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. break;
  40. }
  41. size = needed > 0 ? (needed + 1) : (size * 2);
  42. dynamicBuffer.resize(size);
  43. str = &dynamicBuffer[0];
  44. }
  45. if (state.logFunctionC)
  46. {
  47. // Pass call to registered C log function
  48. (*state.logFunctionC)(level, str);
  49. }
  50. else if (state.logFunctionLua)
  51. {
  52. // Pass call to registered Lua log function
  53. Game::getInstance()->getScriptController()->executeFunction<void>(state.logFunctionLua, "[Logger::Level]s", level, str);
  54. }
  55. else
  56. {
  57. // Log to the default output
  58. gameplay::print(str);
  59. }
  60. va_end(args);
  61. }
  62. bool Logger::isEnabled(Level level)
  63. {
  64. return _state[level].enabled;
  65. }
  66. void Logger::setEnabled(Level level, bool enabled)
  67. {
  68. _state[level].enabled = enabled;
  69. }
  70. void Logger::set(Level level, void (*logFunction) (Level, const char*))
  71. {
  72. State& state = _state[level];
  73. state.logFunctionC = logFunction;
  74. state.logFunctionLua = NULL;
  75. }
  76. void Logger::set(Level level, const char* logFunction)
  77. {
  78. State& state = _state[level];
  79. state.logFunctionLua = logFunction;
  80. state.logFunctionC = NULL;
  81. }
  82. }