rendered paste body#define FOO "Foo"
typedef struct Foo {
int x;
int y;
} Foo;
static Foo *toFoo (lua_State *L, int index)
{
Foo *bar = (Foo *)lua_touserdata(L, index);
if (bar == NULL) luaL_typerror(L, index, FOO);
return bar;
}
static Foo *checkFoo (lua_State *L, int index)
{
Foo *bar;
luaL_checktype(L, index, LUA_TUSERDATA);
bar = (Foo *)luaL_checkudata(L, index, FOO);
if (bar == NULL) luaL_typerror(L, index, FOO);
return bar;
}
static Foo *pushFoo (lua_State *L)
{
Foo *bar = (Foo *)lua_newuserdata(L, sizeof(Foo));
luaL_getmetatable(L, FOO);
lua_setmetatable(L, -2);
return bar;
}
static int Foo_new (lua_State *L)
{
int x = luaL_optint(L, 1, 0);
int y = luaL_optint(L, 2, 0);
Foo *bar = pushFoo(L);
bar->x = x;
bar->y = y;
return 1;
}
static int Foo_yourCfunction (lua_State *L)
{
Foo *bar = checkFoo(L, 1);
printf("this is yourCfunction\t");
lua_pushnumber(L, bar->x);
lua_pushnumber(L, bar->y);
return 2;
}
static int Foo_setx (lua_State *L)
{
Foo *bar = checkFoo(L, 1);
bar->x = luaL_checkint(L, 2);
lua_settop(L, 1);
return 1;
}
static int Foo_sety (lua_State *L)
{
Foo *bar = checkFoo(L, 1);
bar->y = luaL_checkint(L, 2);
lua_settop(L, 1);
return 1;
}
static int Foo_add (lua_State *L)
{
Foo *bar1 = checkFoo(L, 1);
Foo *bar2 = checkFoo(L, 2);
Foo *sum = pushFoo(L);
sum->x = bar1->x + bar2->x;
sum->y = bar1->y + bar2->y;
return 1;
}
static int Foo_dot (lua_State *L)
{
Foo *bar1 = checkFoo(L, 1);
Foo *bar2 = checkFoo(L, 2);
lua_pushnumber(L, bar1->x * bar2->x + bar1->y * bar2->y);
return 1;
}
static const luaL_reg Foo_methods[] = {
{"new", Foo_new},
{"yourCfunction", Foo_yourCfunction},
{"setx", Foo_setx},
{"sety", Foo_sety},
{"add", Foo_add},
{"dot", Foo_dot},
{0, 0}
};
static int Foo_gc (lua_State *L)
{
printf("bye, bye, bar = %p\n", toFoo(L, 1));
return 0;
}
static int Foo_tostring (lua_State *L)
{
char buff[32];
sprintf(buff, "%p", toFoo(L, 1));
lua_pushfstring(L, "Foo (%s)", buff);
return 1;
}
static const luaL_reg Foo_meta[] = {
{"__gc", Foo_gc},
{"__tostring", Foo_tostring},
{"__add", Foo_add},
{0, 0}
};
int Foo_register (lua_State *L)
{
luaL_openlib(L, FOO, Foo_methods, 0); /* create methods table,
add it to the globals */
luaL_newmetatable(L, FOO); /* create metatable for Foo,
and add it to the Lua registry */
luaL_openlib(L, 0, Foo_meta, 0); /* fill metatable */
lua_pushliteral(L, "__index");
lua_pushvalue(L, -3); /* dup methods table*/
lua_rawset(L, -3); /* metatable.__index = methods */
lua_pushliteral(L, "__metatable");
lua_pushvalue(L, -3); /* dup methods table*/
lua_rawset(L, -3); /* hide metatable:
metatable.__metatable = methods */
lua_pop(L, 1); /* drop metatable */
return 1; /* return methods on the stack */
}