summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium42 <rubidium@openttd.org>2021-04-27 18:24:33 +0200
committerrubidium42 <rubidium42@users.noreply.github.com>2021-04-27 19:41:51 +0200
commit0e449f20dcec4e9a04b218205453b40deb947382 (patch)
treeee5f02f7cace06bdf30c3ef18163c4450516c526
parentb54d8a49fb8d635545b2251bfdf41ebee60edc0c (diff)
downloadopenttd-0e449f20dcec4e9a04b218205453b40deb947382.tar.xz
Codechange: writing and string validation to its own functions
-rw-r--r--src/settings.cpp91
1 files changed, 57 insertions, 34 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index 4a04784bc..3095c6079 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -496,6 +496,54 @@ static void Write_ValidateSetting(void *ptr, const SettingDesc *sd, int32 val)
}
/**
+ * Set the string value of a setting.
+ * @param ptr Pointer to the storage location (might be a pointer to a pointer).
+ * @param sld Pointer to the information for the conversions and limitations to apply.
+ * @param p The string to save.
+ */
+static void Write_ValidateString(void *ptr, const SaveLoad *sld, const char *p)
+{
+ switch (GetVarMemType(sld->conv)) {
+ case SLE_VAR_STRB:
+ case SLE_VAR_STRBQ:
+ if (p != nullptr) strecpy((char*)ptr, (const char*)p, (char*)ptr + sld->length - 1);
+ break;
+
+ case SLE_VAR_STR:
+ case SLE_VAR_STRQ:
+ free(*(char**)ptr);
+ *(char**)ptr = p == nullptr ? nullptr : stredup(p);
+ break;
+
+ default: NOT_REACHED();
+ }
+}
+
+/**
+ * Set the string value of a setting.
+ * @param ptr Pointer to the std::string.
+ * @param sld Pointer to the information for the conversions and limitations to apply.
+ * @param p The string to save.
+ */
+static void Write_ValidateStdString(void *ptr, const SaveLoad *sld, const char *p)
+{
+ std::string *dst = reinterpret_cast<std::string *>(ptr);
+
+ switch (GetVarMemType(sld->conv)) {
+ case SLE_VAR_STR:
+ case SLE_VAR_STRQ:
+ if (p != nullptr) {
+ dst->assign(p);
+ } else {
+ dst->clear();
+ }
+ break;
+
+ default: NOT_REACHED();
+ }
+}
+
+/**
* Load values from a group of an IniFile structure into the internal representation
* @param ini pointer to IniFile structure that holds administrative information
* @param sd pointer to SettingDesc structure whose internally pointed variables will
@@ -551,36 +599,11 @@ static void IniLoadSettings(IniFile *ini, const SettingDesc *sd, const char *grp
break;
case SDT_STRING:
- switch (GetVarMemType(sld->conv)) {
- case SLE_VAR_STRB:
- case SLE_VAR_STRBQ:
- if (p != nullptr) strecpy((char*)ptr, (const char*)p, (char*)ptr + sld->length - 1);
- break;
-
- case SLE_VAR_STR:
- case SLE_VAR_STRQ:
- free(*(char**)ptr);
- *(char**)ptr = p == nullptr ? nullptr : stredup((const char*)p);
- break;
-
- default: NOT_REACHED();
- }
+ Write_ValidateString(ptr, sld, (const char *)p);
break;
case SDT_STDSTRING:
- switch (GetVarMemType(sld->conv)) {
- case SLE_VAR_STR:
- case SLE_VAR_STRQ:
- if (p != nullptr) {
- reinterpret_cast<std::string *>(ptr)->assign((const char *)p);
- } else {
- reinterpret_cast<std::string *>(ptr)->clear();
- }
- break;
-
- default: NOT_REACHED();
- }
-
+ Write_ValidateStdString(ptr, sld, (const char *)p);
break;
case SDT_INTLIST: {
@@ -2082,13 +2105,13 @@ bool SetSettingValue(uint index, const char *value, bool force_newgame)
const SettingDesc *sd = &_settings[index];
assert(sd->save.conv & SLF_NO_NETWORK_SYNC);
- if (GetVarMemType(sd->save.conv) == SLE_VAR_STRQ) {
- char **var = (char**)GetVariableAddress((_game_mode == GM_MENU || force_newgame) ? &_settings_newgame : &_settings_game, &sd->save);
- free(*var);
- *var = strcmp(value, "(null)") == 0 ? nullptr : stredup(value);
- } else {
- char *var = (char*)GetVariableAddress(nullptr, &sd->save);
- strecpy(var, value, &var[sd->save.length - 1]);
+ if (GetVarMemType(sd->save.conv) == SLE_VAR_STRQ && strcmp(value, "(null)") == 0) {
+ value = nullptr;
+ }
+
+ void *ptr = GetVariableAddress((_game_mode == GM_MENU || force_newgame) ? &_settings_newgame : &_settings_game, &sd->save);
+ if (sd->desc.cmd == SDT_STRING) {
+ Write_ValidateString(ptr, &sd->save, value);
}
if (sd->desc.proc != nullptr) sd->desc.proc(0);