]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/extra/m_regex_pcre.cpp
Add LOG_ prefix to the log level enum values.
[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 _WIN32
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("Error in regex " + rx + " at offset " + ConvToStr(erroffset) + ": " + error)
39         {
40         }
41 };
42
43 class PCRERegex : public Regex
44 {
45         pcre* regex;
46
47  public:
48         PCRERegex(const std::string& rx) : Regex(rx)
49         {
50                 const char* error;
51                 int erroffset;
52                 regex = pcre_compile(rx.c_str(), 0, &error, &erroffset, NULL);
53                 if (!regex)
54                 {
55                         ServerInstance->Logs->Log("REGEX", LOG_DEBUG, "pcre_compile failed: /%s/ [%d] %s", rx.c_str(), erroffset, error);
56                         throw PCREException(rx, error, erroffset);
57                 }
58         }
59
60         virtual ~PCRERegex()
61         {
62                 pcre_free(regex);
63         }
64
65         virtual bool Matches(const std::string& text)
66         {
67                 if (pcre_exec(regex, NULL, text.c_str(), text.length(), 0, 0, NULL, 0) > -1)
68                 {
69                         // Bang. :D
70                         return true;
71                 }
72                 return false;
73         }
74 };
75
76 class PCREFactory : public RegexFactory
77 {
78  public:
79         PCREFactory(Module* m) : RegexFactory(m, "regex/pcre") {}
80         Regex* Create(const std::string& expr)
81         {
82                 return new PCRERegex(expr);
83         }
84 };
85
86 class ModuleRegexPCRE : public Module
87 {
88  public:
89         PCREFactory ref;
90         ModuleRegexPCRE() : ref(this)
91         {
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)