mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 08:03:45 +01:00
Settings: Push groups in to_table as well
This commit is contained in:
parent
c401a06f8a
commit
3a2f55bc19
@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "lua_api/l_settings.h"
|
#include "lua_api/l_settings.h"
|
||||||
#include "lua_api/l_internal.h"
|
#include "lua_api/l_internal.h"
|
||||||
#include "cpp_api/s_security.h"
|
#include "cpp_api/s_security.h"
|
||||||
|
#include "threading/mutex_auto_lock.h"
|
||||||
#include "util/string.h" // FlagDesc
|
#include "util/string.h" // FlagDesc
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "noise.h"
|
#include "noise.h"
|
||||||
@ -253,20 +254,36 @@ int LuaSettings::l_write(lua_State* L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void push_settings_table(lua_State *L, const Settings *settings)
|
||||||
|
{
|
||||||
|
std::vector<std::string> keys = settings->getNames();
|
||||||
|
lua_newtable(L);
|
||||||
|
for (const std::string &key : keys) {
|
||||||
|
std::string value;
|
||||||
|
Settings *group = nullptr;
|
||||||
|
|
||||||
|
if (settings->getNoEx(key, value)) {
|
||||||
|
lua_pushstring(L, value.c_str());
|
||||||
|
} else if (settings->getGroupNoEx(key, group)) {
|
||||||
|
// Recursively push tables
|
||||||
|
push_settings_table(L, group);
|
||||||
|
} else {
|
||||||
|
// Impossible case (multithreading) due to MutexAutoLock
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_setfield(L, -2, key.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// to_table(self) -> {[key1]=value1,...}
|
// to_table(self) -> {[key1]=value1,...}
|
||||||
int LuaSettings::l_to_table(lua_State* L)
|
int LuaSettings::l_to_table(lua_State* L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
NO_MAP_LOCK_REQUIRED;
|
||||||
LuaSettings* o = checkobject(L, 1);
|
LuaSettings* o = checkobject(L, 1);
|
||||||
|
|
||||||
std::vector<std::string> keys = o->m_settings->getNames();
|
MutexAutoLock(o->m_settings->m_mutex);
|
||||||
|
push_settings_table(L, o->m_settings);
|
||||||
lua_newtable(L);
|
|
||||||
for (const std::string &key : keys) {
|
|
||||||
lua_pushstring(L, o->m_settings->get(key).c_str());
|
|
||||||
lua_setfield(L, -2, key.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,6 +239,8 @@ private:
|
|||||||
|
|
||||||
// Allow TestSettings to run sanity checks using private functions.
|
// Allow TestSettings to run sanity checks using private functions.
|
||||||
friend class TestSettings;
|
friend class TestSettings;
|
||||||
|
// For sane mutex locking when iterating
|
||||||
|
friend class LuaSettings;
|
||||||
|
|
||||||
void updateNoLock(const Settings &other);
|
void updateNoLock(const Settings &other);
|
||||||
void clearNoLock();
|
void clearNoLock();
|
||||||
|
Loading…
Reference in New Issue
Block a user