[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Using tables from the C API
- From: "Henderson, Michael D" <michael.d.henderson@...>
- Date: Wed, 10 Aug 2011 12:41:44 -0600
I'm having trouble understanding how to work with classes and tables using the C API. By class I mean being able to use ":" to pass in a reference to self.
The questions are:
  // how do I add "init" to the table so that I can call "t:init"?
  // how do I get the table "self" that was passed in
  // how do I reference self.debug
They're copied in the example code below.
//--------- start module -----------
module(...)
local core = require 'mylib.core'
function init(p)
    local t = core.create({debug = false})
    t:init(p)
    return t
end
function foo(q)
    self.bah = q or false
end
//--------- end module -----------
//--------- start C API -----------
static const char *mtName = "mt.myLib";
int myCreate(lua_State *L);
int myInit(lua_State *L);
int luaopen_mylib_core(lua_State *L) {
  const struct luaL_Reg myLib[] = {
    {"create", myCreate},
    {"init"  , myInit},
    {0,0}
  }
  luaL_newmetatable(mtName);
  lua_createtable(L, 0, (sizeof(myLib)/sizeof(myLib[0]) + 3);
  lua_register(L, 0, myLib);
  lua_pushliteral(L, "compiled " __DATE__ " " __TIME__ "");
  lua_setfield(L, -2, "libDate");
  return 1;
}
int myCreate(lua_State *L) {
  MyStruct *ud = (MyStruct *)lua_newuserdata(L, sizeof(MyStruct));
  luaL_getmetatable(L, mtName);
  lua_setmetatable(L, -2);
  ud->ms = MyLibrary("parameters");
  // how do I add "init" to the table so that I can call "t:init"?
  return 1;
}
int myInit(lua_State *L) {
  // confirm that we're being passed a table that we created
  MyStruct *ud = (MyStruct *)luaL_checkudata(L, 1, mtName);
  // is "p" really the 2nd parameter?
  const char *p = luaL_checkstring(L, 2); 
  // how do I get the table "self" that was passed in
  // how do I reference self.debug
  return 1;
}
//--------- end C API -----------