From 177dfb131d7f76578162c0713bf0f5bfd368c306 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Sun, 16 Feb 2020 17:38:18 +0000 Subject: 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. --- src/modules/extra/m_regex_posix.cpp | 98 +++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/modules/extra/m_regex_posix.cpp (limited to 'src/modules') 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 + * Copyright (C) 2012-2013 Attila Molnar + * Copyright (C) 2012 Robby + * Copyright (C) 2009-2010 Daniel De Graaf + * Copyright (C) 2009 Uli Schlachter + * Copyright (C) 2008 Thomas Stagner + * + * 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 . + */ + + +#include "inspircd.h" +#include "modules/regex.h" +#include +#include + +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(®buf, 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, ®buf, NULL, 0); + errbuf = new char[sz + 1]; + memset(errbuf, 0, sz + 1); + regerror(errcode, ®buf, errbuf, sz + 1); + error = errbuf; + delete[] errbuf; + regfree(®buf); + throw RegexException(rx, error); + } + } + + ~POSIXRegex() + { + regfree(®buf); + } + + bool Matches(const std::string& text) override + { + return (regexec(®buf, 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) -- cgit v1.3.1-10-gc9f91