From be922fa355fe385b45a2720d48eaf0c809e1874a Mon Sep 17 00:00:00 2001 From: Determinant Date: Mon, 25 May 2015 16:07:34 +0800 Subject: move example files to a dedicated directory --- examples/oop_example.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 examples/oop_example.c (limited to 'examples/oop_example.c') diff --git a/examples/oop_example.c b/examples/oop_example.c new file mode 100644 index 0000000..e9a4ffe --- /dev/null +++ b/examples/oop_example.c @@ -0,0 +1,91 @@ +#include +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" +#include "luaT/luaT.h" +#include +#include + +const char *point_tname = "nerv.Point"; + +typedef struct { + double x, y; + int arr[100]; +} Point; + +static int point_get_sinx (lua_State *L) { + Point *p = luaT_checkudata(L, 1, point_tname); + lua_pushnumber(L, sin(p->x)); + return 1; +} + +static int point_set_x (lua_State *L) { + Point *p = luaT_checkudata(L, 1, point_tname); + p->x = luaL_checknumber(L, 2); + return 0; +} + + +static int point_get_y(lua_State *L) { + Point *p = luaT_checkudata(L, 1, point_tname); + lua_pushnumber(L, sin(p->x)); + return 1; +} + +static int point_newindex(lua_State *L) { + Point *p = luaT_checkudata(L, 1, point_tname); + if (lua_isnumber(L, 2)) + { + int d = luaL_checkinteger(L, 2); + double v = luaL_checknumber(L, 3); + if (0 <= d && d < 100) + p->arr[d] = v; + lua_pushboolean(L, 1); + return 1; + } + else + { + lua_pushboolean(L, 0); + return 1; + } +} + +static int point_index(lua_State *L) { + Point *p = luaT_checkudata(L, 1, point_tname); + if (lua_isnumber(L, 2)) + { + int d = luaL_checkinteger(L, 2); + if (0 <= d && d < 100) + lua_pushnumber(L, p->arr[d]); + lua_pushboolean(L, 1); + return 2; + } + else + { + lua_pushboolean(L, 0); + return 1; + } +} + +int point_new(lua_State *L) { + Point *self = (Point *)malloc(sizeof(Point)); + self->x = 0; + self->y = 0; + luaT_pushudata(L, self, point_tname); + return 1; +} + +static const luaL_Reg point[] = { + {"get_sinx", point_get_sinx}, + {"set_x", point_set_x}, + {"get_y", point_get_y}, + {"__index__", point_index}, + {"__newindex__", point_newindex}, + {NULL, NULL} +}; + +void nerv_point_init(lua_State *L) { + luaT_newmetatable(L, "nerv.Point", NULL, point_new, NULL, NULL); + luaL_register(L, NULL, point); + lua_pop(L, 1); +} -- cgit v1.2.3