diff options
author | Determinant <[email protected]> | 2015-05-25 16:07:34 +0800 |
---|---|---|
committer | Determinant <[email protected]> | 2015-05-25 16:07:34 +0800 |
commit | be922fa355fe385b45a2720d48eaf0c809e1874a (patch) | |
tree | 6ec8747f0463ffb36445d7cadec567c00b8fdbdf /examples/oop_example.c | |
parent | 3036cc0f7597d72a36b1923ab5e0c56a4490be31 (diff) |
move example files to a dedicated directory
Diffstat (limited to 'examples/oop_example.c')
-rw-r--r-- | examples/oop_example.c | 91 |
1 files changed, 91 insertions, 0 deletions
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 <math.h> +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" +#include "luaT/luaT.h" +#include <stdio.h> +#include <stdlib.h> + +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); +} |