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.
This commit is contained in:
Sadie Powell 2020-02-16 17:38:18 +00:00
parent 7bdd72f634
commit 177dfb131d
3 changed files with 110 additions and 0 deletions

1
configure vendored
View File

@ -349,6 +349,7 @@ if (prompt_bool $interactive, $question, 0) {
'm_mysql.cpp' => 'mysql_config --version',
'm_pgsql.cpp' => 'pg_config --version',
'm_regex_pcre.cpp' => 'pcre-config --version',
'm_regex_posix.cpp' => undef,
'm_regex_re2.cpp' => 'pkg-config --exists re2',
'm_regex_tre.cpp' => 'pkg-config --exists tre',
'm_sqlite3.cpp' => 'pkg-config --exists sqlite3',

View File

@ -839,6 +839,8 @@
# glob - Glob patterns, provided via regex_glob. #
# pcre - PCRE regexps, provided via regex_pcre, needs libpcre. #
# tre - TRE regexps, provided via regex_tre, requires libtre. #
# posix - POSIX regexps, provided via regex_posix, not available #
# on Windows, no dependencies on other operating systems. #
# stdlib - stdlib regexps, provided via regex_stdlib, see comment #
# at the <module> tag for info on availability. #
# #
@ -1714,6 +1716,15 @@
# to compile and load this module.
#<module name="regex_re2">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Regular expression provider for POSIX regular expressions.
# You shouldn't need any additional libraries on a POSIX-compatible
# system (i.e.: any Linux, BSD, but not Windows). You must have at
# least 1 provider loaded to use the filter or R-line modules.
# On POSIX-compliant systems, regex syntax can be found by using the
# command: 'man 7 regex'.
#<module name="regex_posix">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Regular expression provider for C++11 std::regex regular expressions.
#<module name="regex_stdlib">

View File

@ -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)