]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/extra/m_regex_posix.cpp
Merge branch 'insp20' into master.
[user/henk/code/inspircd.git] / src / modules / extra / m_regex_posix.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 "modules/regex.h"
23 #include <sys/types.h>
24 #include <regex.h>
25
26 class POSIXRegex : public Regex
27 {
28         regex_t regbuf;
29
30  public:
31         POSIXRegex(const std::string& rx, bool extended) : Regex(rx)
32         {
33                 int flags = (extended ? REG_EXTENDED : 0) | REG_NOSUB;
34                 int errcode;
35                 errcode = regcomp(&regbuf, rx.c_str(), flags);
36                 if (errcode)
37                 {
38                         // Get the error string into a std::string. YUCK this involves at least 2 string copies.
39                         std::string error;
40                         char* errbuf;
41                         size_t sz = regerror(errcode, &regbuf, NULL, 0);
42                         errbuf = new char[sz + 1];
43                         memset(errbuf, 0, sz + 1);
44                         regerror(errcode, &regbuf, errbuf, sz + 1);
45                         error = errbuf;
46                         delete[] errbuf;
47                         regfree(&regbuf);
48                         throw RegexException(rx, error);
49                 }
50         }
51
52         ~POSIXRegex()
53         {
54                 regfree(&regbuf);
55         }
56
57         bool Matches(const std::string& text) CXX11_OVERRIDE
58         {
59                 return (regexec(&regbuf, text.c_str(), 0, NULL, 0) == 0);
60         }
61 };
62
63 class PosixFactory : public RegexFactory
64 {
65  public:
66         bool extended;
67         PosixFactory(Module* m) : RegexFactory(m, "regex/posix") {}
68         Regex* Create(const std::string& expr) CXX11_OVERRIDE
69         {
70                 return new POSIXRegex(expr, extended);
71         }
72 };
73
74 class ModuleRegexPOSIX : public Module
75 {
76         PosixFactory ref;
77
78  public:
79         ModuleRegexPOSIX() : ref(this)
80         {
81         }
82
83         Version GetVersion() CXX11_OVERRIDE
84         {
85                 return Version("Regex Provider Module for POSIX Regular Expressions", VF_VENDOR);
86         }
87
88         void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
89         {
90                 ref.extended = ServerInstance->Config->ConfValue("posix")->getBool("extended");
91         }
92 };
93
94 MODULE_INIT(ModuleRegexPOSIX)