diff options
Diffstat (limited to 'src/luax.h')
-rw-r--r-- | src/luax.h | 340 |
1 files changed, 9 insertions, 331 deletions
@@ -1,335 +1,13 @@ -/** -* Copyright (C) 2018 chai -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is furnished -* to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -/** -* include following 3 files before this -* lua.h -* lauxlib.h -* lualib.h -*/ -#ifndef __LUAX_H -#define __LUAX_H -// for lua 5.1 -#if LUA_VERSION_NUM == 501 +#ifndef __LUAX_H__ +#define __LUAX_H__ -#define LUAX_VERSION "0.1.0" +// Pre declaration. +struct lua_State; -#define luax_newstate luaL_newstate -#define luax_openlibs luaL_openlibs -// load chunk but dont run it -#define luax_loadbuffer luaL_loadbuffer -#define luax_pcall lua_pcall -#define luax_setglobal lua_setglobal -#define luax_pop lua_pop -#define luax_newtable lua_newtable - -/** -* -*/ -#define luax_setglobal_string(L, n, v) (lua_pushstring(L, v), lua_setglobal(L, n)) - -/** -* Get number of args -*/ -#define luax_gettop lua_gettop - -#define luax_gettable lua_gettable - -/** -* Check userdata type. -*/ -#define luax_checktype luaL_checkudata -#define luax_checknumber luaL_checknumber -#define luax_checkinteger luaL_checkinteger -#define luax_checkstring luaL_checkstring -#define luax_checkbool luaL_checkinteger -//bool luax_checkbool(lua_State *L, int numArg) -//{ -// bool b = false; -// if (lua_type(L, numArg) == LUA_TBOOLEAN) -// { -// b = lua_toboolean(L, numArg); -// } -// else -// { -// luaL_typerror(L, numArg, lua_typename(L, LUA_TBOOLEAN)); -// } -// return b; -//} - -/** -* Oprating tables. -*/ -#define luax_rawgetnumber(L, i, k) (lua_rawgeti(L,i, k), lua_tonumber(L, -1)) - -/** -* -*/ -#define luax_typerror luaL_typerror - - -/** -* Error checking -*/ -#define luax_error luaL_error - -/** -* Push value on the top of stack. -*/ -#define luax_pushnumber lua_pushnumber -#define luax_pushstring lua_pushstring -#define luax_pushinteger lua_pushinteger -#define luax_pushboolean lua_pushboolean - -#define luax_rawseti lua_rawseti - -/** -* Set field -*/ -#define luax_setfield lua_setfield -#define luax_setfield_(T, L, k, v)\ - do { lua_push##T(L, v); lua_setfield(L, -2, k); } while (0) - -#define luax_setfield_number(L, k, v) luax_setfield_(number, L, k, v) -#define luax_setfield_string(L, k, v) luax_setfield_(string, L, k, v) -#define luax_setfield_bool(L, k, v) luax_setfield_(boolean, L, k, v) -#define luax_setfield_udata(L, k, v) luax_setfield_(lightuserdata, L, k, v) -#define luax_setfield_cfunc(L, k, v) luax_setfield_(cfunction, L, k, v) -#define luax_setfield_fstring(L, k, ...)\ - do { lua_pushfstring(L, __VA_ARGS__); lua_setfield(L, -2, k); } while (0) - -/** -* If nosuch field push a nil at the top of stack. -*/ -#define luax_getfield(L, I, N) lua_getfield(L, I, N) -inline float luax_getfield_number(lua_State* L, int I, const char* N) -{ - luax_getfield(L, I, N); - float n = luax_checknumber(L, -1); - return n; -} -inline int luax_getfield_integer(lua_State* L, int I, const char* N) -{ - luax_getfield(L, I, N); - int bin = luax_checkinteger(L, -1); - return bin; -} -inline const char* luax_getfield_string(lua_State* L, int I, const char* N) -{ - luax_getfield(L, I, N); - const char* str = luax_checkstring(L, -1); - return str; -} -inline char luax_getfield_bool(lua_State* L, int I, const char* N) -{ - luax_getfield(L, I, N); - char bin = lua_toboolean(L, -1); - return bin; -} - -/** -* Set raw -*/ -#define luax_setraw_(T, L, idx, i, v)\ - (lua_push##T(L, v), lua_rawseti(L, idx, i)) - -#define luax_setraw_string(L, idx, i, v) luax_setraw_(string, L, idx, i, v) -#define luax_setraw_number(L, idx, i, v) luax_setraw_(number, L, idx, i, v) -#define luax_setraw_bool(L, idx, i, v) luax_setraw_(boolean, L, idx, i, v) - -/** -* -*/ -#define luax_optboolean(L, i, x)\ - (!lua_isnoneornil(L, i) ? lua_toboolean(L, i) : (x)) -#define luax_optudata(L, i, name, x)\ - (!lua_isnoneornil(L, i) ? luaL_checkudata(L, i, name) : (x)) -#define luax_optnumber luaL_optnumber - -inline int luax_newlib(lua_State* L, const luaL_Reg* f) -{ - lua_createtable(L, 0, sizeof(f)); - for (; f && f->name; ++f) - { - lua_pushcfunction(L, f->func); - lua_setfield(L, -2, f->name); - } - return 1; // leave lib table on top of stack -} - -/** -* Register a userdefined lua type with given type name. -*/ -inline void luax_newtype(lua_State* L, const char* tname, const luaL_Reg* f) -{ - luaL_newmetatable(L, tname); - - // m.__index = m - lua_pushvalue(L, -1); - lua_setfield(L, -2, "__index"); - - if (f != 0) - luaL_register(L, 0, f); - - lua_pop(L, 1); // Pops metatable. -} - -/** -* Instance of a type. -*/ -inline void* luax_newinstance(lua_State* L, const char* tname, int size) -{ - void* p = lua_newuserdata(L, size); - - luaL_newmetatable(L, tname); - lua_setmetatable(L, -2); - - return p; -} - -/** -* require a module -*/ -inline int luax_require(lua_State* L, const char* mname, lua_CFunction openf, int glb) -{ - openf(L); - if (glb) - { - lua_setglobal(L, mname); - return 0; - } - return 1; -} - -/** -* Return 1 if match. -*/ -inline int luax_istype(lua_State* L, int idx, const char* tname) -{ - if (lua_getmetatable(L, idx)) - { - /* get metatable called tname */ - lua_getfield(L, LUA_REGISTRYINDEX, tname); - if (lua_rawequal(L, -1, -2)) - { - lua_pop(L, 2); // pop both metatables - return 1; - } - lua_pop(L, 2); - return 0; - } - /* value at idx has no metatable */ - return 0; -} - -#define luax_is(T, L, i) (lua_is##T(L, i)) -#define luax_isnumber(L, i) luax_is(number, L, i) -#define luax_isstring(L, i) luax_is(string, L, i) -#define luax_istable(L, i) luax_is(table, L, i) -#define luax_isnil(L, i) luax_is(nil, L, i) -/** -* To userdata. -*/ -inline void* luax_toudata(lua_State* L, int idx) -{ - void* p = lua_touserdata(L, idx); - if (p == NULL) - luaL_typerror(L, idx, "userdata"); // if p is not userdata - return p; -} - -/** -* Get table index size. -*/ -inline int luax_tableidxlen(lua_State* L, int i) -{ - return lua_objlen(L, i); -} - -/** -* Get table hash size -inline int luax_tbalehashlen(lua_State* L, int i) -{ - -} -*/ - -/** -* Get table hash and index size -inline int luax_tablelen(lua_State* L, int i) -{ - -} -*/ - -/** -* Set value i in stack a global value called v, and -* don't pop it. -*/ -#define luax_justglobal(L, i, v) (lua_pushvalue(L, i), lua_setglobal(L, v)) - -inline int luax_table_insert(lua_State * L, int tindex, int vindex, int pos) -{ - if (tindex < 0) - tindex = lua_gettop(L) + 1 + tindex; - if (vindex < 0) - vindex = lua_gettop(L) + 1 + vindex; - if (pos == -1) - { - lua_pushvalue(L, vindex); - lua_rawseti(L, tindex, lua_objlen(L, tindex) + 1); - return 0; - } - else if (pos < 0) - pos = lua_objlen(L, tindex) + 1 + pos; - for (int i = lua_objlen(L, tindex) + 1; i > pos; --i) - { - lua_rawgeti(L, tindex, i - 1); - lua_rawseti(L, tindex, i); - } - lua_pushvalue(L, vindex); - lua_rawseti(L, tindex, pos); - return 0; -} - -/** -* Add the package loader to the package.loaders table. -*/ -inline int luax_register_searcher(lua_State * L, lua_CFunction f, int pos) -{ - lua_getglobal(L, "package"); - - if (lua_isnil(L, -1)) - return luaL_error(L, "Can't register searcher: package table does not exist."); - - lua_getfield(L, -1, "loaders"); - - if (lua_isnil(L, -1)) - return luaL_error(L, "Can't register searcher: package.loaders table does not exist."); - - lua_pushcfunction(L, f); - luax_table_insert(L, -2, -1, pos); - lua_pop(L, 3); - return 0; -} - -#endif +// include lua.hpp before this +#include "luax_runtime.h" +#include "luax_state.h" +#include "luax_ref.h" +#include "luax_object.h" #endif
\ No newline at end of file |