All pastes #567769 Raw Edit

jlulian38

public cpp v1 · immutable
·published 2007-06-15 03:41 UTC
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 */}