diff options
| author | 2020-02-16 17:38:18 +0000 | |
|---|---|---|
| committer | 2020-02-19 01:29:53 +0000 | |
| commit | 177dfb131d7f76578162c0713bf0f5bfd368c306 (patch) | |
| tree | 5ff6a6df11b9bfa2b5a9f8067fcf5926667bf0a4 /src/modules | |
| parent | Merge 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.cpp | 98 |
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(®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) |
