aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_regex_stdlib.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2018-07-31 03:14:09 +0100
committerGravatar Sadie Powell2019-01-25 02:52:28 +0000
commit97aba4f8a57877ab68ddd618b96f52342970f998 (patch)
treec8e162e21d563dd631db80460dc04003ba6653c4 /src/modules/m_regex_stdlib.cpp
parentReplace the override macro with the override keyword. (diff)
Move m_regex_stdlib out of extras now it can always be built.
Diffstat (limited to 'src/modules/m_regex_stdlib.cpp')
-rw-r--r--src/modules/m_regex_stdlib.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/modules/m_regex_stdlib.cpp b/src/modules/m_regex_stdlib.cpp
new file mode 100644
index 000000000..269e64c75
--- /dev/null
+++ b/src/modules/m_regex_stdlib.cpp
@@ -0,0 +1,94 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2012 ChrisTX <chris@rev-crew.info>
+ *
+ * This file is part of InspIRCd. InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "inspircd.h"
+#include "modules/regex.h"
+#include <regex>
+
+class StdRegex : public Regex
+{
+ std::regex regexcl;
+
+ public:
+ StdRegex(const std::string& rx, std::regex::flag_type fltype) : Regex(rx)
+ {
+ try{
+ regexcl.assign(rx, fltype | std::regex::optimize);
+ }
+ catch(std::regex_error rxerr)
+ {
+ throw RegexException(rx, rxerr.what());
+ }
+ }
+
+ bool Matches(const std::string& text) override
+ {
+ return std::regex_search(text, regexcl);
+ }
+};
+
+class StdRegexFactory : public RegexFactory
+{
+ public:
+ std::regex::flag_type regextype;
+ StdRegexFactory(Module* m) : RegexFactory(m, "regex/stdregex") {}
+ Regex* Create(const std::string& expr) override
+ {
+ return new StdRegex(expr, regextype);
+ }
+};
+
+class ModuleRegexStd : public Module
+{
+public:
+ StdRegexFactory ref;
+ ModuleRegexStd() : ref(this)
+ {
+ }
+
+ Version GetVersion() override
+ {
+ return Version("Regex Provider Module for std::regex", VF_VENDOR);
+ }
+
+ void ReadConfig(ConfigStatus& status) override
+ {
+ ConfigTag* Conf = ServerInstance->Config->ConfValue("stdregex");
+ std::string regextype = Conf->getString("type", "ecmascript");
+
+ if (stdalgo::string::equalsci(regextype, "bre"))
+ ref.regextype = std::regex::basic;
+ else if (stdalgo::string::equalsci(regextype, "ere"))
+ ref.regextype = std::regex::extended;
+ else if (stdalgo::string::equalsci(regextype, "awk"))
+ ref.regextype = std::regex::awk;
+ else if (stdalgo::string::equalsci(regextype, "grep"))
+ ref.regextype = std::regex::grep;
+ else if (stdalgo::string::equalsci(regextype, "egrep"))
+ ref.regextype = std::regex::egrep;
+ else
+ {
+ if (!stdalgo::string::equalsci(regextype, "ecmascript"))
+ ServerInstance->SNO->WriteToSnoMask('a', "WARNING: Non-existent regex engine '%s' specified. Falling back to ECMAScript.", regextype.c_str());
+ ref.regextype = std::regex::ECMAScript;
+ }
+ }
+};
+
+MODULE_INIT(ModuleRegexStd)