mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-09 18:49:03 -04:00
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:
parent
7bdd72f634
commit
177dfb131d
1
configure
vendored
1
configure
vendored
@ -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',
|
||||
|
@ -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">
|
||||
|
98
src/modules/extra/m_regex_posix.cpp
Normal file
98
src/modules/extra/m_regex_posix.cpp
Normal 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(®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)
|
Loading…
x
Reference in New Issue
Block a user