summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChrisTX <xpipe@hotmail.de>2012-09-22 06:11:43 +0200
committerattilamolnar <attilamolnar@hush.com>2012-09-22 15:52:18 +0200
commit3b63bc840f540d8bfdae37b6860083c18f99815c (patch)
tree4a6adec1fdc7bf748643ef48ecea2bc70f82e569
parent3f72ca011ca25f0c7fab559169ac77b92173ffec (diff)
m_regex_stdlib: A regex provider for the C++11 container std::regex
For it to work you need a standards compliant implementation as for instance Visual C++ 2010 and 2012 deliver. GCC's libstdc++ does not implement this class yet.
-rw-r--r--docs/conf/modules.conf.example11
-rw-r--r--src/modules/extra/m_regex_stdlib.cpp112
2 files changed, 123 insertions, 0 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example
index 84e3b26ab..b3034d3e9 100644
--- a/docs/conf/modules.conf.example
+++ b/docs/conf/modules.conf.example
@@ -1389,6 +1389,17 @@
#<module name="m_regex_posix.so">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
+# Regular Expression Provider for C++11 std::regex Regular Expressions.
+# This module works on any fully compliant implementation of the C++11
+# std::regex container. Examples for such are Visual C++ 2010 and newer
+# but not libstdc++ (which GCC uses)
+#<module name="m_regex_stdlib.so">
+
+# Specify the Regular Expression engine to use here. Valid settings are
+# bre, ere, awk, grep, egrep, ecmascript (default if not specified)
+#<stdregex type="ecmascript">
+
+#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Regular Expression Provider for TRE Regular Expressions.
# This is the same regular expression engine used by UnrealIRCd, so
# if you are most familiar with the syntax of /spamfilter from there,
diff --git a/src/modules/extra/m_regex_stdlib.cpp b/src/modules/extra/m_regex_stdlib.cpp
new file mode 100644
index 000000000..4942e9739
--- /dev/null
+++ b/src/modules/extra/m_regex_stdlib.cpp
@@ -0,0 +1,112 @@
+/*
+ * 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 "m_regex.h"
+#include <regex>
+
+/* $ModDesc: Regex Provider Module for std::regex Regular Expressions */
+/* $ModConfig: <stdregex type="ecmascript">
+ * Specify the Regular Expression engine to use here. Valid settings are
+ * bre, ere, awk, grep, egrep, ecmascript (default if not specified)*/
+/* $CompileFlags: -std=c++11 */
+/* $ModDep: m_regex.h */
+
+class StdRegexException : public ModuleException
+{
+public:
+ StdRegexException(const std::string& rx, const std::string& error)
+ : ModuleException(std::string("Error in regex ") + rx + ": " + error)
+ {
+ }
+};
+
+class StdRegex : public Regex
+{
+private:
+ 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 StdRegexException(rx, rxerr.what());
+ }
+ }
+
+ virtual bool Matches(const std::string& text)
+ {
+ 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)
+ {
+ return new StdRegex(expr, regextype);
+ }
+};
+
+class ModuleRegexStd : public Module
+{
+public:
+ StdRegexFactory ref;
+ ModuleRegexStd() : ref(this) {
+ ServerInstance->Modules->AddService(ref);
+ Implementation eventlist[] = { I_OnRehash };
+ ServerInstance->Modules->Attach(eventlist, this, 1);
+ OnRehash(NULL);
+ }
+
+ Version GetVersion()
+ {
+ return Version("Regex Provider Module for std::regex", VF_VENDOR);
+ }
+
+ void OnRehash(User* u)
+ {
+ ConfigTag* Conf = ServerInstance->Config->ConfValue("stdregex");
+ std::string regextype = Conf->getString("type", "ecmascript");
+
+ if(regextype == "bre")
+ ref.regextype = std::regex::basic;
+ else if(regextype == "ere")
+ ref.regextype = std::regex::extended;
+ else if(regextype == "awk")
+ ref.regextype = std::regex::awk;
+ else if(regextype == "grep")
+ ref.regextype = std::regex::grep;
+ else if(regextype == "egrep")
+ ref.regextype = std::regex::egrep;
+ else
+ {
+ if(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)