Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Register a Lua Class in C

Tags:

c

lua

My C code consists of:

/*
** lgamelib.c
** Game Library
** See Copyright Notice in lua.h
*/


#include <stdlib.h>
#include <math.h>

#define lgamelib_c
#define LUA_LIB

#include "lua.h"

#include "lauxlib.h"
#include "lualib.h"

static int game_workspace (lua_State *L) {
  lua_pushstring(L, "Workspace");
  return 1;
}

static int game_sound (lua_State *L) {

  return 1;
}


static const luaL_Reg gamelib[] = {
  {"Workspace", game_workspace},
  {"Sound",  game_sound},
  {NULL, NULL}
};


/*
** Open game library
*/
LUALIB_API int luaopen_game (lua_State *L) {
  luaL_register(L, LUA_GAMELIBNAME, gamelib);
  //lua_pushnumber(L, PI);
  //lua_setfield(L, -2, "pi");
  //lua_pushnumber(L, HUGE_VAL);
  //lua_setfield(L, -2, "huge");
  return 1;
}

After building the solution, for example, 'print(game.Workspace())' returns that 'game' is nil even though I've registered it. Any solutions? I'm completely stuck... I believe I need to include lgamelib.c somewhere but I don't believe I need to.

like image 686
Josh Ferrara Avatar asked Feb 18 '26 09:02

Josh Ferrara


1 Answers

In the version of Lua I'm using (LuaInterface with lua5.1.1), I have to add new libraries to the lualibs[] array in linit.c. This array is called by the luaL_openlibs function, which will then call your luaopen_game function, or whichever library you are adding. I don't know if this is the "correct" way to do add libraries, but it works for my code.

Edit: After thinking about it, you don't need to necissarily modify the linit.c file. After you create your lua state, you could manually call the library loader.

lua_State  *L = lua_open();
lua_pushcfunction(L, luaopen_game);
lua_pushstring(L, "game");
lua_call(L, 1, 0);
like image 137
kyork Avatar answered Feb 20 '26 00:02

kyork



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!