]> 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 5feff013f44ee217a896a3f01ca377b966949315..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;
@@ -496,23 +511,43 @@ long ConfigTag::getInt(const std::string &key, long def, long min, long 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)