]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configparser.cpp
Release v3.0.0 alpha 8.
[user/henk/code/inspircd.git] / src / configparser.cpp
index 34ee006fe1e523545fa963bfc0095d9c577f6165..627cd78e19a1961dc89e173ca0a5a557a300e161 100644 (file)
@@ -402,6 +402,21 @@ bool ConfigTag::readString(const std::string& key, std::string& value, bool allo
        return false;
 }
 
+std::string ConfigTag::getString(const std::string& key, const std::string& def, const TR1NS::function<bool(const std::string&)>& validator)
+{
+       std::string res;
+       if (!readString(key, res))
+               return def;
+
+       if (!validator(res))
+       {
+               ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "WARNING: The value of <%s:%s> is not valid; value set to %s.",
+                       tag.c_str(), key.c_str(), def.c_str());
+               return def;
+       }
+       return res;
+}
+
 std::string ConfigTag::getString(const std::string& key, const std::string& def, size_t minlen, size_t maxlen)
 {
        std::string res;
@@ -419,6 +434,44 @@ std::string ConfigTag::getString(const std::string& key, const std::string& def,
 
 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.
@@ -452,40 +505,49 @@ long ConfigTag::getInt(const std::string &key, long def, long min, long max)
        long res = strtol(res_cstr, &res_tail, 0);
        if (res_tail == res_cstr)
                return def;
-       switch (toupper(*res_tail))
-       {
-               case 'K':
-                       res = res * 1024;
-                       break;
-               case 'M':
-                       res = res * 1024 * 1024;
-                       break;
-               case 'G':
-                       res = res * 1024 * 1024 * 1024;
-                       break;
-       }
 
+       CheckMagnitude(tag, key, result, res, def, res_tail);
        CheckRange(tag, key, res, def, min, max);
        return res;
 }
 
-long ConfigTag::getDuration(const std::string& key, long def, long min, long max)
+unsigned long ConfigTag::getUInt(const std::string& key, unsigned long def, unsigned long min, unsigned long max)
+{
+       std::string result;
+       if (!readString(key, result))
+               return def;
+
+       const char* res_cstr = result.c_str();
+       char* res_tail = NULL;
+       unsigned long res = strtoul(res_cstr, &res_tail, 0);
+       if (res_tail == res_cstr)
+               return def;
+
+       CheckMagnitude(tag, key, result, res, def, res_tail);
+       CheckRange(tag, key, res, def, min, max);
+       return res;
+}
+
+unsigned long ConfigTag::getDuration(const std::string& key, unsigned long def, unsigned long min, unsigned long max)
 {
        std::string duration;
        if (!readString(key, duration))
                return def;
 
-       long ret = InspIRCd::Duration(duration);
+       unsigned long ret = InspIRCd::Duration(duration);
        CheckRange(tag, key, ret, def, min, max);
        return ret;
 }
 
-double ConfigTag::getFloat(const std::string &key, double def)
+double ConfigTag::getFloat(const std::string& key, double def, double min, double max)
 {
        std::string result;
        if (!readString(key, result))
                return def;
-       return strtod(result.c_str(), NULL);
+
+       double res = strtod(result.c_str(), NULL);
+       CheckRange(tag, key, res, def, min, max);
+       return res;
 }
 
 bool ConfigTag::getBool(const std::string &key, bool def)