From b70bef06e7a8a985a15a730c7cadba2403c09d29 Mon Sep 17 00:00:00 2001 From: aquanight Date: Fri, 5 Sep 2008 18:53:07 +0000 Subject: [PATCH] Adjustments to regex creation, and add PCRE provider git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10396 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/extra/m_regex.h | 10 ++- src/modules/extra/m_regex_glob.cpp | 5 +- src/modules/extra/m_regex_pcre.cpp | 100 +++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 src/modules/extra/m_regex_pcre.cpp diff --git a/src/modules/extra/m_regex.h b/src/modules/extra/m_regex.h index 361d54831..cffb94cbd 100644 --- a/src/modules/extra/m_regex.h +++ b/src/modules/extra/m_regex.h @@ -40,8 +40,10 @@ class RegexFactoryRequest : public Request { private: std::string regex; - + public: + Regex* result; + RegexFactoryRequest(Module* Me, Module* Target, const std::string& rx) : Request(Me, Target, "REGEX"), regex(rx) { } @@ -50,6 +52,12 @@ public: { return regex; } + + Regex* Create() + { + Send(); + return this->result; + } }; class RegexNameRequest : public Request diff --git a/src/modules/extra/m_regex_glob.cpp b/src/modules/extra/m_regex_glob.cpp index 8d81b9a03..7977c77f1 100644 --- a/src/modules/extra/m_regex_glob.cpp +++ b/src/modules/extra/m_regex_glob.cpp @@ -59,8 +59,9 @@ public: { RegexFactoryRequest* rfr = (RegexFactoryRequest*)request; std::string rx = rfr->GetRegex(); - Regex* rxo = (Regex*)new GlobRegex(rx, ServerInstance); // Cast to base class first, since theoretically the pointer could change by that. - return (const char*)(rxo); + rfr->result = (Regex*)new GlobRegex(rx, ServerInstance); + return "OK"; } + return NULL; } }; diff --git a/src/modules/extra/m_regex_pcre.cpp b/src/modules/extra/m_regex_pcre.cpp new file mode 100644 index 000000000..aea4cbbb6 --- /dev/null +++ b/src/modules/extra/m_regex_pcre.cpp @@ -0,0 +1,100 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" +#include +#include "m_regex.h" + +/* $ModDesc: Regex Provider Module for PCRE */ +/* $ModDep: m_regex.h */ +/* $CompileFlags: exec("pcre-config --cflags") */ +/* $LinkerFlags: exec("pcre-config --libs") rpath("pcre-config --libs") -lpcre */ + +#ifdef WINDOWS +#pragma comment(lib, "pcre.lib") +#endif + +class PCREException : public ModuleException +{ +public: + PCREException(const std::string& rx, const std::string& error, int erroffset) + : ModuleException(std::string("Error in regex ") + rx + " at offset " + ConvToStr(erroffset) + ": " + error) + { + } +}; + +class PCRERegex : public Regex +{ +private: + pcre* regex; + +public: + PCRERegex(const std::string& rx, InspIRCd* Me) : Regex(rx, Me) + { + const char* error; + int erroffset; + regex = pcre_compile(rx.c_str(), 0, &error, &erroffset, NULL); + if (!regex) + { + Me->Logs->Log("REGEX", DEBUG, "pcre_compile failed: /%s/ [%d] %s", rx.c_str(), erroffset, error); + throw PCREException(rx, error, erroffset); + } + } + + virtual ~PCRERegex() + { + pcre_free(regex); + } + + virtual bool Matches(const std::string& text) + { + if (pcre_exec(regex, NULL, text.c_str(), text.length(), 0, 0, NULL, 0) > -1) + { + // Bang. :D + return true; + } + return false; + } +}; + +class ModuleRegexPCRE : public Module +{ +public: + ModuleRegexPCRE(InspIRCd* Me) : Module(Me) + { + Me->Modules->PublishInterface("RegularExpression", this); + Implementation eventlist[] = { I_OnRequest }; + Me->Modules->Attach(eventlist, this, 1); + } + + virtual ~ModuleRegexPCRE() + { + ServerInstance->Modules->UnpublishInterface("RegularExpression", this); + } + + virtual const char* OnRequest(Request* request) + { + if (strcmp("REGEX-NAME", request->GetId()) == 0) + { + return "pcre"; + } + else if (strcmp("REGEX", request->GetId()) == 0) + { + RegexFactoryRequest* rfr = (RegexFactoryRequest*)request; + std::string rx = rfr->GetRegex(); + rfr->result = new PCRERegex(rx, ServerInstance); + return "OK"; + } + return NULL; + } +}; -- 2.39.2