From 1b6c4e6e4a16ed49570e1787641e5af79dba23f7 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Sun, 19 Jun 2016 18:42:13 +0000 Subject: MirLua: almost work m_json git-svn-id: http://svn.miranda-ng.org/main/trunk@17013 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MirLua/Modules/m_json/src/metatable.cpp | 120 ++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 plugins/MirLua/Modules/m_json/src/metatable.cpp (limited to 'plugins/MirLua/Modules/m_json/src/metatable.cpp') diff --git a/plugins/MirLua/Modules/m_json/src/metatable.cpp b/plugins/MirLua/Modules/m_json/src/metatable.cpp new file mode 100644 index 0000000000..b7b1c37f24 --- /dev/null +++ b/plugins/MirLua/Modules/m_json/src/metatable.cpp @@ -0,0 +1,120 @@ +#include "stdafx.h" + +void lua2json(lua_State *L, JSONNode &node) +{ + const char *name = lua_tostring(L, -2); + + switch (lua_type(L, -1)) + { + case LUA_TNIL: + node.nullify(); + break; + case LUA_TSTRING: + node = lua_tostring(L, -1); + break; + case LUA_TBOOLEAN: + node = lua_toboolean(L, -1) != 0; + break; + case LUA_TNUMBER: + node = lua_tonumber(L, -1); + break; + case LUA_TTABLE: + { + node.cast(JSON_NODE); + if (name) + node.set_name(name); + + lua_pushnil(L); + while (lua_next(L, -2) != 0) + { + JSONNode child; + lua2json(L, child); + node << child; + + lua_pop(L, 1); + } + } + } +} + +static int json__index(lua_State *L) +{ + JSONNode &node = *((JSON*)luaL_checkudata(L, 1, MT_JSON))->node; + + switch (node.type()) + { + case JSON_NULL: + lua_pushnil(L); + break; + case JSON_STRING: + lua_pushstring(L, node.as_string().c_str()); + break; + case JSON_NUMBER: + lua_pushnumber(L, node.as_int()); + break; + case JSON_BOOL: + lua_pushboolean(L, node.as_bool()); + break; + case JSON_NODE: + case JSON_ARRAY: + new (L) JSONNode(node); + luaL_setmetatable(L, MT_JSON); + } + + return 1; +} + +static int json__newindex(lua_State *L) +{ + JSONNode &node = *((JSON*)luaL_checkudata(L, 1, MT_JSON))->node; + const char *key = lua_tostring(L, 2); + + JSONNode child = node[key]; + if (child.isnull()) + { + child.set_name(key); + node << child; + } + lua2json(L, child); + node[key] = child; + + return 0; +} + +static int json__len(lua_State *L) +{ + JSONNode &node = *((JSON*)luaL_checkudata(L, 1, MT_JSON))->node; + + lua_pushnumber(L, node.size()); + + return 1; +} + +static int json__tostring(lua_State *L) +{ + JSONNode &node = *((JSON*)luaL_checkudata(L, 1, MT_JSON))->node; + + lua_pushstring(L, node.write().c_str()); + + return 1; +} + +static int json__gc(lua_State *L) +{ + JSON *json = (JSON*)luaL_checkudata(L, 1, MT_JSON); + + delete json; + + return 0; +} + +static const struct luaL_Reg jsonApi[] = +{ + { "__index", json__index }, + { "__newindex", json__newindex }, + { "__len", json__len }, + { "__tostring", json__tostring }, + { "__gc", json__gc }, + + { NULL, NULL } +}; -- cgit v1.2.3