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