aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorGravatar Sadie Powell2020-02-16 17:38:18 +0000
committerGravatar Sadie Powell2020-02-19 01:29:53 +0000
commit177dfb131d7f76578162c0713bf0f5bfd368c306 (patch)
tree5ff6a6df11b9bfa2b5a9f8067fcf5926667bf0a4 /src/modules
parentMerge branch 'insp3' into master. (diff)
Revert "Remove the now obsolete regex_posix module".
The C++ SG16 has decided to obsolete std::regex because they think its broken and don't want to fix it so this module will probably outlive the regex_stdlib one. 🙄 This reverts commit e1dda3396c64f66b5889f72b65759251fab549ac.
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/extra/m_regex_posix.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/modules/extra/m_regex_posix.cpp b/src/modules/extra/m_regex_posix.cpp
new file mode 100644
index 000000000..abf195765
--- /dev/null
+++ b/src/modules/extra/m_regex_posix.cpp
@@ -0,0 +1,98 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2013 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2012-2013 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012 Robby <robby@chatbelgie.be>
+ * Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
+ * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ *
+ * 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 <sys/types.h>
+#include <regex.h>
+
+class POSIXRegex : public Regex
+{
+ regex_t regbuf;
+
+ public:
+ POSIXRegex(const std::string& rx, bool extended) : Regex(rx)
+ {
+ int flags = (extended ? REG_EXTENDED : 0) | REG_NOSUB;
+ int errcode;
+ errcode = regcomp(&regbuf, rx.c_str(), flags);
+ if (errcode)
+ {
+ // Get the error string into a std::string. YUCK this involves at least 2 string copies.
+ std::string error;
+ char* errbuf;
+ size_t sz = regerror(errcode, &regbuf, NULL, 0);
+ errbuf = new char[sz + 1];
+ memset(errbuf, 0, sz + 1);
+ regerror(errcode, &regbuf, errbuf, sz + 1);
+ error = errbuf;
+ delete[] errbuf;
+ regfree(&regbuf);
+ throw RegexException(rx, error);
+ }
+ }
+
+ ~POSIXRegex()
+ {
+ regfree(&regbuf);
+ }
+
+ bool Matches(const std::string& text) override
+ {
+ return (regexec(&regbuf, text.c_str(), 0, NULL, 0) == 0);
+ }
+};
+
+class PosixFactory : public RegexFactory
+{
+ public:
+ bool extended;
+ PosixFactory(Module* m) : RegexFactory(m, "regex/posix") {}
+ Regex* Create(const std::string& expr) override
+ {
+ return new POSIXRegex(expr, extended);
+ }
+};
+
+class ModuleRegexPOSIX : public Module
+{
+ PosixFactory ref;
+
+ public:
+ ModuleRegexPOSIX() : ref(this)
+ {
+ }
+
+ Version GetVersion() override
+ {
+ return Version("Regex Provider Module for POSIX Regular Expressions", VF_VENDOR);
+ }
+
+ void ReadConfig(ConfigStatus& status) override
+ {
+ ref.extended = ServerInstance->Config->ConfValue("posix")->getBool("extended");
+ }
+};
+
+MODULE_INIT(ModuleRegexPOSIX)