Reduced code for userdataType significantly

UTYPE_* enum wasn't needed, meta2utype is now the meta string and return string for each userdata type
This commit is contained in:
Monster Iestyn 2017-01-19 21:35:53 +00:00
parent 1b542c6501
commit 930527a3d6
1 changed files with 39 additions and 124 deletions

View File

@ -87,101 +87,56 @@ static int lib_print(lua_State *L)
return 0;
}
enum
{
UTYPE_NULL=0,
UTYPE_STATE,
UTYPE_MOBJINFO,
UTYPE_SFXINFO,
UTYPE_MOBJ,
UTYPE_MAPTHING,
UTYPE_PLAYER,
UTYPE_TICCMD,
UTYPE_SKIN,
UTYPE_POWERS,
UTYPE_SOUNDSID,
UTYPE_VERTEX,
UTYPE_LINE,
UTYPE_SIDE,
UTYPE_SUBSECTOR,
UTYPE_SECTOR,
UTYPE_FFLOOR,
#ifdef HAVE_LUA_SEGS
UTYPE_SEG,
UTYPE_NODE,
#endif
UTYPE_MAPHEADER,
UTYPE_CVAR,
UTYPE_SECTORLINES,
UTYPE_SIDENUM,
#ifdef HAVE_LUA_SEGS
UTYPE_NODEBBOX,
UTYPE_NODECHILDREN,
#endif
UTYPE_BBOX,
UTYPE_HUDINFO,
UTYPE_PATCH,
UTYPE_COLORMAP,
UTYPE_CAMERA,
};
#define META_UTYPE(name) {META_##name, UTYPE_##name}
static const struct {
const char *meta;
UINT8 utype;
const char *utype;
} meta2utype[] = {
META_UTYPE(STATE),
META_UTYPE(MOBJINFO),
META_UTYPE(SFXINFO),
{META_STATE, "state_t"},
{META_MOBJINFO, "mobjinfo_t"},
{META_SFXINFO, "sfxinfo_t"},
META_UTYPE(MOBJ),
META_UTYPE(MAPTHING),
{META_MOBJ, "mobj_t"},
{META_MAPTHING, "mapthing_t"},
META_UTYPE(PLAYER),
META_UTYPE(TICCMD),
META_UTYPE(SKIN),
META_UTYPE(POWERS),
META_UTYPE(SOUNDSID),
{META_PLAYER, "player_t"},
{META_TICCMD, "ticcmd_t"},
{META_SKIN, "skin_t"},
{META_POWERS, "player_t.powers"},
{META_SOUNDSID, "skin_t.soundsid"},
META_UTYPE(VERTEX),
META_UTYPE(LINE),
META_UTYPE(SIDE),
META_UTYPE(SUBSECTOR),
META_UTYPE(SECTOR),
META_UTYPE(FFLOOR),
{META_VERTEX, "vertex_t"},
{META_LINE, "line_t"},
{META_SIDE, "side_t"},
{META_SUBSECTOR, "subsector_t"},
{META_SECTOR, "sector_t"},
{META_FFLOOR, "ffloor_t"},
#ifdef HAVE_LUA_SEGS
META_UTYPE(SEG),
META_UTYPE(NODE),
{META_SEG, "seg_t"},
{META_NODE, "node_t"},
#endif
META_UTYPE(MAPHEADER),
{META_MAPHEADER, "mapheader_t"},
META_UTYPE(CVAR),
{META_CVAR, "consvar_t"},
META_UTYPE(SECTORLINES),
META_UTYPE(SIDENUM),
{META_SECTORLINES, "sector_t.lines"},
{META_SIDENUM, "line_t.sidenum"},
#ifdef HAVE_LUA_SEGS
META_UTYPE(NODEBBOX),
META_UTYPE(NODECHILDREN),
{META_NODEBBOX, "node_t.bbox"},
{META_NODECHILDREN, "node_t.children"},
#endif
META_UTYPE(BBOX),
{META_BBOX, "bbox"},
META_UTYPE(HUDINFO),
META_UTYPE(PATCH),
META_UTYPE(COLORMAP),
META_UTYPE(CAMERA),
{NULL, UTYPE_NULL}
{META_HUDINFO, "hudinfo_t"},
{META_PATCH, "patch_t"},
{META_COLORMAP, "colormap"},
{META_CAMERA, "camera_t"},
{NULL, NULL}
};
#undef META_UTYPE
static UINT8 GetUserdataUType(lua_State *L)
// goes through the above list and returns the utype string for the userdata type
// returns "unknown" instead if we couldn't find the right userdata type
static const char *GetUserdataUType(lua_State *L)
{
UINT8 i;
lua_getmetatable(L, -1);
@ -198,57 +153,17 @@ static UINT8 GetUserdataUType(lua_State *L)
}
lua_pop(L, 1);
return UTYPE_NULL;
return "unknown";
}
// Return a string representing the type of userdata the given var is
// e.g. players[0] -> "player_t"
// or players[0].powers -> "player_t.powers"
static int lib_userdataType(lua_State *L)
{
lua_settop(L, 1); // pop everything except arg 1 (in case somebody decided to add more)
luaL_checktype(L, 1, LUA_TUSERDATA);
switch (GetUserdataUType(L))
{
case UTYPE_STATE: lua_pushliteral(L, "state_t"); break;
case UTYPE_MOBJINFO: lua_pushliteral(L, "mobjinfo_t"); break;
case UTYPE_SFXINFO: lua_pushliteral(L, "sfxinfo_t"); break;
case UTYPE_MOBJ: lua_pushliteral(L, "mobj_t"); break;
case UTYPE_MAPTHING: lua_pushliteral(L, "mapthing_t"); break;
case UTYPE_PLAYER: lua_pushliteral(L, "player_t"); break;
case UTYPE_TICCMD: lua_pushliteral(L, "ticcmd_t"); break;
case UTYPE_SKIN: lua_pushliteral(L, "skin_t"); break;
case UTYPE_POWERS: lua_pushliteral(L, "player_t.powers"); break;
case UTYPE_SOUNDSID: lua_pushliteral(L, "skin_t.soundsid"); break;
case UTYPE_VERTEX: lua_pushliteral(L, "vertex_t"); break;
case UTYPE_LINE: lua_pushliteral(L, "line_t"); break;
case UTYPE_SIDE: lua_pushliteral(L, "side_t"); break;
case UTYPE_SUBSECTOR: lua_pushliteral(L, "subsector_t"); break;
case UTYPE_SECTOR: lua_pushliteral(L, "sector_t"); break;
case UTYPE_FFLOOR: lua_pushliteral(L, "ffloor_t"); break;
#ifdef HAVE_LUA_SEGS
case UTYPE_SEG: lua_pushliteral(L, "seg_t"); break;
case UTYPE_NODE: lua_pushliteral(L, "node_t"); break;
#endif
case UTYPE_MAPHEADER: lua_pushliteral(L, "mapheader_t"); break;
case UTYPE_CVAR: lua_pushliteral(L, "cvar_t"); break;
case UTYPE_SECTORLINES: lua_pushliteral(L, "sector_t.lines"); break;
case UTYPE_SIDENUM: lua_pushliteral(L, "line_t.sidenum"); break;
#ifdef HAVE_LUA_SEGS
case UTYPE_NODEBBOX: lua_pushliteral(L, "node_t.bbox"); break;
case UTYPE_NODECHILDREN: lua_pushliteral(L, "node_t.children"); break;
#endif
case UTYPE_BBOX: lua_pushliteral(L, "bbox"); break;
case UTYPE_HUDINFO: lua_pushliteral(L, "hudinfo_t"); break;
case UTYPE_PATCH: lua_pushliteral(L, "patch_t"); break;
case UTYPE_COLORMAP: lua_pushliteral(L, "colormap"); break;
case UTYPE_CAMERA: lua_pushliteral(L, "camera_t"); break;
default: return luaL_error(L, "Unknown userdata type");
}
lua_pushstring(L, GetUserdataUType(L));
return 1;
}