DLL_LOCAL enumtype* registerEnum(const char* name,int def = 0) { return registerEnum(name,typeid(T).name(),def); }
error System::init(const char* processorFile) { m_lastError = NULL; m_lastErrorSize = 0; LuaState L = luaL_newstate(); m_luaState = L; lua_atpanic(L,LuaStatePanicHandler); #ifdef _DEBUG /* more verbose error messages, including full stack info */ lua_pushboolean(L,1); lua_setglobal(L,"fxdebug"); #endif luaL_openlibs(L); if (luaL_dofile(L, processorFile)){ updateError(); return true; } // prepare the stack for fast access to frequent tables lua_getglobal(L,"fxenums"); assert(lua_type(L,-1) == LUA_TTABLE); assert(lua_gettop(L) == FXENUMS); lua_getglobal(L,"fxlib"); assert(lua_type(L,-1) == LUA_TTABLE); assert(lua_gettop(L) == FXBUILDER); lua_getglobal(L,"fxids"); assert(lua_type(L,-1) == LUA_TTABLE); assert(lua_gettop(L) == FXIDS); lua_getglobal(L,"fxerror"); assert(lua_type(L,-1) == LUA_TFUNCTION); assert(lua_gettop(L) == FXERROR); lua_getglobal(L,"fxlights"); assert(lua_type(L,-1) == LUA_TTABLE); assert(lua_gettop(L) == FXLIGHTS); lua_getglobal(L,"fxuserenums"); assert(lua_type(L,-1) == LUA_TTABLE); assert(lua_gettop(L) == FXUSERENUMS); // initialize enum table lua_getfield(L,FXENUMS,"effect"); for (int i = 0; i < NUM_EFFECTS; i++){ registerEnum(L,EffectType_toString((EffectType)i),i); } lua_pop(L,1); lua_getfield(L,FXENUMS,"parameter"); for (int i = 0; i < NUM_PARAMETERS; i++){ registerEnum(L,ParameterType_toString((ParameterType)i),i); } lua_pop(L,1); lua_getfield(L,FXENUMS,"generator"); for (int i = 0; i < NUM_GENERERATORS; i++){ registerEnum(L,GeneratorType_toString((GeneratorType)i),i); } lua_pop(L,1); lua_getfield(L,FXENUMS,"dataconvert"); for (int i = 0; i < NUM_DATACONVERTS; i++){ registerEnum(L,DataConvert_toString((DataConvert)i),i); } lua_pop(L,1); lua_getfield(L,FXENUMS,"group"); for (int i = 0; i < NUM_GROUPS; i++){ registerEnum(L,GroupType_toString((GroupType)i),i); } lua_pop(L,1); lua_getfield(L,FXENUMS,"storage"); for (int i = 0; i < NUM_STORAGES; i++){ registerEnum(L,StorageType_toString((StorageType)i),i); } lua_pop(L,1); // make effectlib enum indexable for (int i = 0; i < NUM_EFFECTS; i++){ lua_getfield(L,FXBUILDER, EffectType_toString((EffectType)i) ); assert(lua_type(L,-1) == LUA_TTABLE); lua_rawseti (L,FXBUILDER, i ); } // make generatorlib enum indexable lua_getglobal(L,"fxgenerators"); assert(lua_type(L,-1) == LUA_TTABLE); for (int i = 0; i < NUM_GENERERATORS; i++){ lua_getfield(L,-1, GeneratorType_toString((GeneratorType)i) ); assert(lua_type(L,-1) == LUA_TTABLE); lua_rawseti (L,-2, i ); } lua_pop(L,1); return false; }