aboutsummaryrefslogtreecommitdiff
path: root/src/Logger/LuaLogger.c
blob: 5739791710a5229b94081170d6ada00e0f754215 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "Logger/LuaLogger.h"

#include "Logger/Logger.h"

#include <lauxlib.h>
#include <lua.h>

static void add_value(lua_State *lua, luaL_Buffer *buffer, int index) {
  int type = lua_type(lua, index);

  if (type == LUA_TSTRING || type == LUA_TNUMBER) {
    luaL_addstring(buffer, lua_tostring(lua, index));
  } else if (type == LUA_TBOOLEAN) {
    luaL_addstring(buffer, lua_toboolean(lua, index) ? "true" : "false");
  } else if (type == LUA_TNIL) {
    luaL_addstring(buffer, "nil");
  } else {
    luaL_addchar(buffer, '<');
    luaL_addstring(buffer, lua_typename(lua, type));
    luaL_addchar(buffer, '>');
  }
}

static int log_from_lua(lua_State *lua) {
  LogLevel level = (LogLevel)lua_tointeger(lua, lua_upvalueindex(1));
  int argument_count = lua_gettop(lua);
  int index;
  luaL_Buffer buffer;

  if (!logger_is_enabled(level)) {
    return 0;
  }

  luaL_buffinit(lua, &buffer);
  for (index = 1; index <= argument_count; ++index) {
    if (index > 1) {
      luaL_addchar(&buffer, '\t');
    }
    add_value(lua, &buffer, index);
  }
  luaL_pushresult(&buffer);
  logger_log(level, "%s", lua_tostring(lua, -1));
  lua_pop(lua, 1);
  return 0;
}

static void set_log_function(lua_State *lua, const char *name, LogLevel level) {
  lua_pushinteger(lua, (lua_Integer)level);
  lua_pushcclosure(lua, log_from_lua, 1);
  lua_setfield(lua, -2, name);
}

void lua_logger_register(lua_State *lua) {
  lua_newtable(lua);
  set_log_function(lua, "error", LOG_LEVEL_ERROR);
  set_log_function(lua, "warn", LOG_LEVEL_WARNING);
  set_log_function(lua, "info", LOG_LEVEL_INFO);
  set_log_function(lua, "debug", LOG_LEVEL_DEBUG);
  lua_setglobal(lua, "log");
}