From 21cbcd876af63c66b6b4432a825fed544987cb18 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 30 Jun 2021 16:19:06 +0200 Subject: [PATCH] Forward compatibility - config substitutions: 1) Verify whether a value looks like an enum 2) Always report substitution of an enum with a boolean. --- src/libslic3r/Config.cpp | 14 +++++++++++++- src/libslic3r/Config.hpp | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 68b464599..cef27a414 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -501,6 +501,16 @@ void ConfigBase::set_deserialize(std::initializer_list items this->set_deserialize(item.opt_key, item.opt_value, substitutions_ctxt, item.append); } +static inline bool looks_like_enum_value(const std::string &s) +{ + if (value.empty() || value.size() > 64 || ! isalpha(value.front())) + return false; + for (const char c : s) + if (! (isalnum(c) || c == '_' || c == '-')) + return false; + return true; +} + bool ConfigBase::set_deserialize_raw(const t_config_option_key &opt_key_src, const std::string &value, ConfigSubstitutionContext& substitutions_ctxt, bool append) { t_config_option_key opt_key = opt_key_src; @@ -546,8 +556,10 @@ bool ConfigBase::set_deserialize_raw(const t_config_option_key &opt_key_src, con // Deserialize failed, try to substitute with a default value. assert(substitutions_ctxt.rule == ForwardCompatibilitySubstitutionRule::Enable || substitutions_ctxt.rule == ForwardCompatibilitySubstitutionRule::EnableSilent); - if (opt_key == "gcode_flavor" && (value == "marlin2" || value == "marlinfirmware")) + if (optdef->type == coEnum && opt_key == "gcode_flavor" && (value == "marlin2" || value == "marlinfirmware")) static_cast*>(opt)->value = gcfMarlin; + else if (optdef->type == coBool && looks_like_enum_value(value)) + static_cast(opt)->value = boost::iequals(value, "enabled") || boost::iequals(value, "on"); else opt->set(optdef->default_value.get()); diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index d17d8befe..1504448b5 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1251,11 +1251,11 @@ public: bool deserialize(const std::string &str, bool append = false) override { UNUSED(append); - if (str == "1" || boost::iequals(str, "enabled") || boost::iequals(str, "on")) { + if (str == "1") { this->value = true; return true; } - if (str == "0" || boost::iequals(str, "disabled") || boost::iequals(str, "off")) { + if (str == "0") { this->value = false; return true; }