[Base/Core] Work on config/cvars. Properly escape string values when saving config.

This commit is contained in:
gibbed
2019-08-04 07:09:05 -05:00
parent 82f85c98f0
commit bee55ce5bb
3 changed files with 185 additions and 49 deletions

View File

@@ -7,6 +7,10 @@
#include "xenia/base/string_util.h"
namespace cvar {
namespace toml {
std::string EscapeString(const std::string& str);
}
class ICommandVar {
public:
virtual ~ICommandVar() = default;
@@ -148,7 +152,7 @@ inline std::string CommandVar<bool>::ToString(bool val) {
}
template <>
inline std::string CommandVar<std::string>::ToString(std::string val) {
return "\"" + val + "\"";
return toml::EscapeString(val);
}
template <class T>
@@ -203,52 +207,52 @@ inline void AddCommandVar(ICommandVar* cv) {
void ParseLaunchArguments(int argc, char** argv);
template <typename T>
T* define_configvar(const char* name, T* defaultValue, const char* description,
T* define_configvar(const char* name, T* default_value, const char* description,
const char* category, bool is_transient) {
IConfigVar* cfgVar =
new ConfigVar<T>(name, defaultValue, description, category, is_transient);
IConfigVar* cfgVar = new ConfigVar<T>(name, default_value, description,
category, is_transient);
AddConfigVar(cfgVar);
return defaultValue;
return default_value;
}
template <typename T>
T* define_cmdvar(const char* name, T* defaultValue, const char* description) {
ICommandVar* cmdVar = new CommandVar<T>(name, defaultValue, description);
T* define_cmdvar(const char* name, T* default_value, const char* description) {
ICommandVar* cmdVar = new CommandVar<T>(name, default_value, description);
AddCommandVar(cmdVar);
return defaultValue;
return default_value;
}
#define DEFINE_double(name, defaultValue, description, category) \
DEFINE_CVar(name, defaultValue, description, category, false, double)
#define DEFINE_double(name, default_value, description, category) \
DEFINE_CVar(name, default_value, description, category, false, double)
#define DEFINE_int32(name, defaultValue, description, category) \
DEFINE_CVar(name, defaultValue, description, category, false, int32_t)
#define DEFINE_int32(name, default_value, description, category) \
DEFINE_CVar(name, default_value, description, category, false, int32_t)
#define DEFINE_uint64(name, defaultValue, description, category) \
DEFINE_CVar(name, defaultValue, description, category, false, uint64_t)
#define DEFINE_uint64(name, default_value, description, category) \
DEFINE_CVar(name, default_value, description, category, false, uint64_t)
#define DEFINE_string(name, defaultValue, description, category) \
DEFINE_CVar(name, defaultValue, description, category, false, std::string)
#define DEFINE_string(name, default_value, description, category) \
DEFINE_CVar(name, default_value, description, category, false, std::string)
#define DEFINE_transient_string(name, defaultValue, description, category) \
DEFINE_CVar(name, defaultValue, description, category, true, std::string)
#define DEFINE_transient_string(name, default_value, description, category) \
DEFINE_CVar(name, default_value, description, category, true, std::string)
#define DEFINE_bool(name, defaultValue, description, category) \
DEFINE_CVar(name, defaultValue, description, category, false, bool)
#define DEFINE_bool(name, default_value, description, category) \
DEFINE_CVar(name, default_value, description, category, false, bool)
#define DEFINE_CVar(name, defaultValue, description, category, is_transient, \
type) \
namespace cvars { \
type name = defaultValue; \
} \
namespace cv { \
static auto cv_##name = cvar::define_configvar( \
#name, &cvars::name, description, category, is_transient); \
#define DEFINE_CVar(name, default_value, description, category, is_transient, \
type) \
namespace cvars { \
type name = default_value; \
} \
namespace cv { \
static auto cv_##name = cvar::define_configvar( \
#name, &cvars::name, description, category, is_transient); \
}
// CmdVars can only be strings for now, we don't need any others
#define CmdVar(name, defaultValue, description) \
#define CmdVar(name, default_value, description) \
namespace cvars { \
std::string name = defaultValue; \
std::string name = default_value; \
} \
namespace cv { \
static auto cv_##name = \