]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/extra/m_regex_pcre.cpp
Merge pull request #96 from Justasic/insp20
[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 "m_regex.h"
24
25 /* $ModDesc: Regex Provider Module for PCRE */
26 /* $ModDep: m_regex.h */
27 /* $CompileFlags: exec("pcre-config --cflags") */
28 /* $LinkerFlags: exec("pcre-config --libs") rpath("pcre-config --libs") -lpcre */
29
30 #ifdef WINDOWS
31 # pragma comment(lib, "libpcre.lib")
32 #endif
33
34 class PCREException : public ModuleException
35 {
36 public:
37         PCREException(const std::string& rx, const std::string& error, int erroffset)
38                 : ModuleException(std::string("Error in regex ") + rx + " at offset " + ConvToStr(erroffset) + ": " + error)
39         {
40         }
41 };
42
43 class PCRERegex : public Regex
44 {
45 private:
46         pcre* regex;
47
48 public:
49         PCRERegex(const std::string& rx) : Regex(rx)
50         {
51                 const char* error;
52                 int erroffset;
53                 regex = pcre_compile(rx.c_str(), 0, &error, &erroffset, NULL);
54                 if (!regex)
55                 {
56                         ServerInstance->Logs->Log("REGEX", DEBUG, "pcre_compile failed: /%s/ [%d] %s", rx.c_str(), erroffset, error);
57                         throw PCREException(rx, error, erroffset);
58                 }
59         }
60
61         virtual ~PCRERegex()
62         {
63                 pcre_free(regex);
64         }
65
66         virtual bool Matches(const std::string& text)
67         {
68                 if (pcre_exec(regex, NULL, text.c_str(), text.length(), 0, 0, NULL, 0) > -1)
69                 {
70                         // Bang. :D
71                         return true;
72                 }
73                 return false;
74         }
75 };
76
77 class PCREFactory : public RegexFactory
78 {
79  public:
80         PCREFactory(Module* m) : RegexFactory(m, "regex/pcre") {}
81         Regex* Create(const std::string& expr)
82         {
83                 return new PCRERegex(expr);
84         }
85 };
86
87 class ModuleRegexPCRE : public Module
88 {
89 public:
90         PCREFactory ref;
91         ModuleRegexPCRE() : ref(this) {
92                 ServerInstance->Modules->AddService(ref);
93         }
94
95         Version GetVersion()
96         {
97                 return Version("Regex Provider Module for PCRE", VF_VENDOR);
98         }
99 };
100
101 MODULE_INIT(ModuleRegexPCRE)