int LuaArchive::GetArchiveInfo(lua_State* L) { const std::string archiveName = luaL_checksstring(L, 1); CArchiveScanner::ArchiveData archiveData = archiveScanner->GetArchiveData(archiveName); if (archiveData.IsEmpty()) { return 0; } lua_createtable(L, 0, archiveData.GetInfo().size()); for (const auto& pair: archiveData.GetInfo()) { const std::string& itemName = pair.first; const InfoItem& itemData = pair.second; lua_pushsstring(L, itemName); switch (itemData.valueType) { case INFO_VALUE_TYPE_STRING: { lua_pushsstring(L, itemData.valueTypeString); } break; case INFO_VALUE_TYPE_INTEGER: { lua_pushinteger(L, itemData.value.typeInteger); } break; case INFO_VALUE_TYPE_FLOAT: { lua_pushnumber(L, itemData.value.typeFloat); } break; case INFO_VALUE_TYPE_BOOL: { lua_pushboolean(L, itemData.value.typeBool); } break; default: assert(false); } lua_rawset(L, -3); } return 1; }
int LuaArchive::HasArchive(lua_State* L) { const std::string archiveName = luaL_checksstring(L, 1); CArchiveScanner::ArchiveData archiveData = archiveScanner->GetArchiveData(archiveName); lua_pushboolean(L, !archiveData.IsEmpty()); return 1; }
int LuaArchive::GetArchiveReplaces(lua_State* L) { const std::string archiveName = luaL_checksstring(L, 1); CArchiveScanner::ArchiveData archiveData = archiveScanner->GetArchiveData(archiveName); if (archiveData.IsEmpty()) { return 0; } const std::vector<std::string>& replaces = archiveData.GetReplaces(); unsigned int count = 0; lua_createtable(L, replaces.size(), 0); for (const std::string& replace: replaces) { lua_pushsstring(L, replace); lua_rawseti(L, -2, ++count); } return 1; }