+std::string ConfigTag::getString(const std::string& key, const std::string& def, size_t minlen, size_t maxlen)
+{
+ std::string res;
+ if (!readString(key, res))
+ return def;
+
+ if (res.length() < minlen || res.length() > maxlen)
+ {
+ ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "WARNING: The length of <%s:%s> is not between %ld and %ld; value set to %s.",
+ tag.c_str(), key.c_str(), minlen, maxlen, def.c_str());
+ return def;
+ }
+ return res;
+}
+
+namespace
+{
+ /** Check for an invalid magnitude specifier. If one is found a warning is logged and the
+ * value is corrected (set to \p def).
+ * @param tag The tag name; used in the warning message.
+ * @param key The key name; used in the warning message.
+ * @param val The full value set in the config as a string.
+ * @param num The value to verify and modify if needed.
+ * @param def The default value, \p res will be set to this if \p tail does not contain a.
+ * valid magnitude specifier.
+ * @param tail The location in the config value at which the magnifier is located.
+ */
+ template <typename Numeric>
+ void CheckMagnitude(const std::string& tag, const std::string& key, const std::string& val, Numeric& num, Numeric def, const char* tail)
+ {
+ // If this is NULL then no magnitude specifier was given.
+ if (!*tail)
+ return;
+
+ switch (toupper(*tail))
+ {
+ case 'K':
+ num *= 1024;
+ return;
+
+ case 'M':
+ num *= 1024 * 1024;
+ return;
+
+ case 'G':
+ num *= 1024 * 1024 * 1024;
+ return;
+ }
+
+ const std::string message = "WARNING: <" + tag + ":" + key + "> value of " + val + " contains an invalid magnitude specifier '"
+ + tail + "'; value set to " + ConvToStr(def) + ".";
+ ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, message);
+ num = def;
+ }
+
+ /** Check for an out of range value. If the value falls outside the boundaries a warning is
+ * logged and the value is corrected (set to \p def).
+ * @param tag The tag name; used in the warning message.
+ * @param key The key name; used in the warning message.
+ * @param num The value to verify and modify if needed.
+ * @param def The default value, \p res will be set to this if (min <= res <= max) doesn't hold true.
+ * @param min Minimum accepted value for \p res.
+ * @param max Maximum accepted value for \p res.
+ */
+ template <typename Numeric>
+ void CheckRange(const std::string& tag, const std::string& key, Numeric& num, Numeric def, Numeric min, Numeric max)
+ {
+ if (num >= min && num <= max)
+ return;
+
+ const std::string message = "WARNING: <" + tag + ":" + key + "> value of " + ConvToStr(num) + " is not between "
+ + ConvToStr(min) + " and " + ConvToStr(max) + "; value set to " + ConvToStr(def) + ".";
+ ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, message);
+ num = def;
+ }
+}
+