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/m_json.vcxproj | 28 ++++++ plugins/MirLua/Modules/m_json/src/main.cpp | 48 ++++++++++ plugins/MirLua/Modules/m_json/src/metatable.cpp | 120 ++++++++++++++++++++++++ plugins/MirLua/Modules/m_json/src/stdafx.cxx | 1 + plugins/MirLua/Modules/m_json/src/stdafx.h | 37 ++++++++ 5 files changed, 234 insertions(+) create mode 100644 plugins/MirLua/Modules/m_json/m_json.vcxproj create mode 100644 plugins/MirLua/Modules/m_json/src/main.cpp create mode 100644 plugins/MirLua/Modules/m_json/src/metatable.cpp create mode 100644 plugins/MirLua/Modules/m_json/src/stdafx.cxx create mode 100644 plugins/MirLua/Modules/m_json/src/stdafx.h (limited to 'plugins/MirLua/Modules/m_json') diff --git a/plugins/MirLua/Modules/m_json/m_json.vcxproj b/plugins/MirLua/Modules/m_json/m_json.vcxproj new file mode 100644 index 0000000000..a16b5b743e --- /dev/null +++ b/plugins/MirLua/Modules/m_json/m_json.vcxproj @@ -0,0 +1,28 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + m_json + {99712BCA-F86F-4214-967D-1298DF0F4A13} + + + + + \ No newline at end of file diff --git a/plugins/MirLua/Modules/m_json/src/main.cpp b/plugins/MirLua/Modules/m_json/src/main.cpp new file mode 100644 index 0000000000..fe987d36f3 --- /dev/null +++ b/plugins/MirLua/Modules/m_json/src/main.cpp @@ -0,0 +1,48 @@ +#include "stdafx.h" + +static int lua_Decode(lua_State *L) +{ + const char *string = luaL_checkstring(L, 1); + + JSONNode *node = json_parse(string); + new (L) JSON(node); + luaL_setmetatable(L, MT_JSON); + + return 1; +} + +static int lua_Encode(lua_State *L) +{ + luaL_checktype(L, 1, LUA_TTABLE); + + JSONNode *node = json_new(JSON_NODE); + lua_pushnil(L); + while (lua_next(L, 1) != 0) + { + lua2json(L, *node); + lua_pop(L, 1); + } + JSON *mt = new (L) JSON(node); + luaL_setmetatable(L, MT_JSON); + + return 1; +} + +static const luaL_Reg methods[] = +{ + { "Dcode", lua_Decode }, + { "Encode", lua_Encode }, + + { NULL, NULL } +}; + +extern "C" LUAMOD_API int luaopen_m_json(lua_State *L) +{ + luaL_newlib(L, methods); + + luaL_newmetatable(L, MT_JSON); + luaL_setfuncs(L, jsonApi, 0); + lua_pop(L, 1); + + return 1; +} \ No newline at end of file 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 } +}; diff --git a/plugins/MirLua/Modules/m_json/src/stdafx.cxx b/plugins/MirLua/Modules/m_json/src/stdafx.cxx new file mode 100644 index 0000000000..1577c4e3bc --- /dev/null +++ b/plugins/MirLua/Modules/m_json/src/stdafx.cxx @@ -0,0 +1 @@ +#include "stdafx.h" \ No newline at end of file diff --git a/plugins/MirLua/Modules/m_json/src/stdafx.h b/plugins/MirLua/Modules/m_json/src/stdafx.h new file mode 100644 index 0000000000..d8ecdcacb5 --- /dev/null +++ b/plugins/MirLua/Modules/m_json/src/stdafx.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include +//#include "..\..\..\src\mlua_metatable.h" + +#include +#include +#include + +struct JSON +{ + JSONNode *node; + bool bDelete; + + JSON(JSONNode &refNode, bool bCopy = false) + : node(bCopy ? json_copy(&refNode) : &refNode), bDelete(bCopy) { } + JSON(JSONNode *n, bool bD = true) + : node(n), bDelete(bD) { } + ~JSON() + { + if (bDelete) + json_delete(node); + } + + __inline void* operator new(size_t size, lua_State *L) + { + return lua_newuserdata(L, size); + } +}; + +void lua2json(lua_State *L, JSONNode &node); + +extern const luaL_Reg jsonApi[]; + +#define MT_JSON "JSON" \ No newline at end of file -- cgit v1.2.3