#define MAKE_SDL_TYPE(L, meta, index, flib) \ { \ (void)luaL_newmetatable(L, meta); \ lua_pushliteral(L, "__index"); \ lua_pushcfunction(L, index); \ lua_rawset(L, -3); \ luaL_register(L, NULL, flib); \ } #define RETURN_INTEGER_FIELD(L, index, name, value) \ if(strcmp(index, name) == 0) \ { \ lua_pushinteger(L, value); \ return 1; \ } #define LUA_SDL_RECT "SDL_RECT" static int sdl_rect_index(lua_State *L) { SDL_Rect *rect = luaL_checkudata(L, 1, LUA_SDL_RECT); const char *index = luaL_checkstring(L, 2); RETURN_INTEGER_FIELD(L, index, "x", rect->x) RETURN_INTEGER_FIELD(L, index, "y", rect->y) RETURN_INTEGER_FIELD(L, index, "w", rect->w) RETURN_INTEGER_FIELD(L, index, "h", rect->h) return 0; }