From 2df56b811b362dbf5a05a0bc7b0eee5ee4d77a40 Mon Sep 17 00:00:00 2001 From: aquanight Date: Fri, 5 Sep 2008 20:02:02 +0000 Subject: TRE regex provider (the same engine used by Unreal 3.2) git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10399 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/extra/m_regex_tre.cpp | 106 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/modules/extra/m_regex_tre.cpp (limited to 'src/modules/extra/m_regex_tre.cpp') diff --git a/src/modules/extra/m_regex_tre.cpp b/src/modules/extra/m_regex_tre.cpp new file mode 100644 index 000000000..2a89015d9 --- /dev/null +++ b/src/modules/extra/m_regex_tre.cpp @@ -0,0 +1,106 @@ +/* +------------------------------------+ + * | 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 "m_regex.h" +#include +#include + +/* $ModDesc: Regex Provider Module for TRE Regular Expressions */ +/* $CompileFlags: pkgconfincludes("tre","tre/regex.h","") */ +/* $LinkerFlags: pkgconflibs("tre","/libtre.so","-ltre") rpath("pkg-config --libs tre") */ +/* $ModDep: m_regex.h */ + +class TRERegexException : public ModuleException +{ +public: + TRERegexException(const std::string& rx, const std::string& error) + : ModuleException(std::string("Error in regex ") + rx + ": " + error) + { + } +}; + +class TRERegex : public Regex +{ +private: + regex_t regbuf; + +public: + TRERegex(const std::string& rx, InspIRCd* Me) : Regex(rx, Me) + { + int flags = REG_EXTENDED | REG_NOSUB; + int errcode; + errcode = regcomp(®buf, rx.c_str(), flags); + if (errcode) + { + // Get the error string into a std::string. YUCK this involves at least 2 string copies. + std::string error; + char* errbuf; + size_t sz = regerror(errcode, ®buf, NULL, 0); + errbuf = new char[sz + 1]; + memset(errbuf, 0, sz + 1); + regerror(errcode, ®buf, errbuf, sz + 1); + error = errbuf; + delete[] errbuf; + regfree(®buf); + throw TRERegexException(rx, error); + } + } + + virtual ~TRERegex() + { + regfree(®buf); + } + + virtual bool Matches(const std::string& text) + { + if (regexec(®buf, text.c_str(), 0, NULL, 0) == 0) + { + // Bang. :D + return true; + } + return false; + } +}; + +class ModuleRegexTRE : public Module +{ +public: + ModuleRegexTRE(InspIRCd* Me) : Module(Me) + { + Me->Modules->PublishInterface("RegularExpression", this); + Implementation eventlist[] = { I_OnRequest }; + Me->Modules->Attach(eventlist, this, 1); + } + + virtual ~ModuleRegexTRE() + { + ServerInstance->Modules->UnpublishInterface("RegularExpression", this); + } + + virtual const char* OnRequest(Request* request) + { + if (strcmp("REGEX-NAME", request->GetId()) == 0) + { + return "tre"; + } + else if (strcmp("REGEX", request->GetId()) == 0) + { + RegexFactoryRequest* rfr = (RegexFactoryRequest*)request; + std::string rx = rfr->GetRegex(); + rfr->result = new TRERegex(rx, ServerInstance); + return "OK"; + } + return NULL; + } +}; -- cgit v1.2.3