]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configparser.cpp
Add support for the IRCv3 account-tag specification.
[user/henk/code/inspircd.git] / src / configparser.cpp
index 5feff013f44ee217a896a3f01ca377b966949315..8250530443c7b38c96aadd93336c21929f8910a5 100644 (file)
@@ -213,25 +213,25 @@ struct Parser
                        mandatory_tag.clear();
                }
 
-               if (name == "include")
+               if (stdalgo::string::equalsci(name, "include"))
                {
                        stack.DoInclude(tag, flags);
                }
-               else if (name == "files")
+               else if (stdalgo::string::equalsci(name, "files"))
                {
                        for(ConfigItems::iterator i = items->begin(); i != items->end(); i++)
                        {
                                stack.DoReadFile(i->first, i->second, flags, false);
                        }
                }
-               else if (name == "execfiles")
+               else if (stdalgo::string::equalsci(name, "execfiles"))
                {
                        for(ConfigItems::iterator i = items->begin(); i != items->end(); i++)
                        {
                                stack.DoReadFile(i->first, i->second, flags, true);
                        }
                }
-               else if (name == "define")
+               else if (stdalgo::string::equalsci(name, "define"))
                {
                        if (flags & FLAG_USE_COMPAT)
                                throw CoreException("<define> tags may only be used in XML-style config (add <config format=\"xml\">)");
@@ -241,12 +241,12 @@ struct Parser
                                throw CoreException("Variable definition must include variable name");
                        stack.vars[varname] = value;
                }
-               else if (name == "config")
+               else if (stdalgo::string::equalsci(name, "config"))
                {
                        std::string format = tag->getString("format");
-                       if (format == "xml")
+                       if (stdalgo::string::equalsci(format, "xml"))
                                flags &= ~FLAG_USE_COMPAT;
-                       else if (format == "compat")
+                       else if (stdalgo::string::equalsci(format, "compat"))
                                flags |= FLAG_USE_COMPAT;
                        else if (!format.empty())
                                throw CoreException("Unknown configuration format " + format);
@@ -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)