]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/extra/m_regex_pcre.cpp
Issue #604, fix m_dnsbl, broken in accccc212cd4f08a3c5532b1ae7a17e76bac8718
[user/henk/code/inspircd.git] / src / modules / extra / m_regex_pcre.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5  *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
6  *
7  * This file is part of InspIRCd.  InspIRCd is free software: you can
8  * redistribute it and/or modify it under the terms of the GNU General Public
9  * License as published by the Free Software Foundation, version 2.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
14  * details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20
21 #include "inspircd.h"
22 #include <pcre.h>
23 #include "modules/regex.h"
24
25 /* $ModDep: modules/regex.h */
26 /* $CompileFlags: exec("pcre-config --cflags") */
27 /* $LinkerFlags: exec("pcre-config --libs") rpath("pcre-config --libs") -lpcre */
28
29 #ifdef _WIN32
30 # pragma comment(lib, "libpcre.lib")
31 #endif
32
33 class PCREException : public ModuleException
34 {
35  public:
36         PCREException(const std::string& rx, const std::string& error, int erroffset)
37                 : ModuleException("Error in regex " + rx + " at offset " + ConvToStr(erroffset) + ": " + error)
38         {
39         }
40 };
41
42 class PCRERegex : public Regex
43 {
44         pcre* regex;
45
46  public:
47         PCRERegex(const std::string& rx) : Regex(rx)
48         {
49                 const char* error;
50                 int erroffset;
51                 regex = pcre_compile(rx.c_str(), 0, &error, &erroffset, NULL);
52                 if (!regex)
53                 {
54                         ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "pcre_compile failed: /%s/ [%d] %s", rx.c_str(), erroffset, error);
55                         throw PCREException(rx, error, erroffset);
56                 }
57         }
58
59         ~PCRERegex()
60         {
61                 pcre_free(regex);
62         }
63
64         bool Matches(const std::string& text)
65         {
66                 if (pcre_exec(regex, NULL, text.c_str(), text.length(), 0, 0, NULL, 0) > -1)
67                 {
68                         // Bang. :D
69                         return true;
70                 }
71                 return false;
72         }
73 };
74
75 class PCREFactory : public RegexFactory
76 {
77  public:
78         PCREFactory(Module* m) : RegexFactory(m, "regex/pcre") {}
79         Regex* Create(const std::string& expr)
80         {
81                 return new PCRERegex(expr);
82         }
83 };
84
85 class ModuleRegexPCRE : public Module
86 {
87  public:
88         PCREFactory ref;
89         ModuleRegexPCRE() : ref(this)
90         {
91                 ServerInstance->Modules->AddService(ref);
92         }
93
94         Version GetVersion() CXX11_OVERRIDE
95         {
96                 return Version("Regex Provider Module for PCRE", VF_VENDOR);
97         }
98 };
99
100 MODULE_INIT(ModuleRegexPCRE)