diff options
| author | Adam <Adam@anope.org> | 2012-02-22 18:12:02 -0500 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2012-02-22 18:12:02 -0500 |
| commit | 3850b073ddf610415de54dced9ff134397779676 (patch) | |
| tree | c1a464fba432a7a79535fac4c05cc46f8f19901e /modules/extra | |
| parent | 81e50dd1f404c9bad008fe1b569dad134df91125 (diff) | |
Added regex support for many commands, such as akill, sqline, snline,
all of the */list commands, etc.
Also extended the ability of akill to match a full nick!user@host and
real name of users.
Diffstat (limited to 'modules/extra')
| -rw-r--r-- | modules/extra/m_regex_pcre.cpp | 55 | ||||
| -rw-r--r-- | modules/extra/m_regex_posix.cpp | 57 | ||||
| -rw-r--r-- | modules/extra/m_regex_tre.cpp | 58 |
3 files changed, 170 insertions, 0 deletions
diff --git a/modules/extra/m_regex_pcre.cpp b/modules/extra/m_regex_pcre.cpp new file mode 100644 index 000000000..998a7692d --- /dev/null +++ b/modules/extra/m_regex_pcre.cpp @@ -0,0 +1,55 @@ +/* RequiredLibraries: pcre */ + +#include "module.h" +#include <pcre.h> + +class PCRERegex : public Regex +{ + pcre *regex; + + public: + PCRERegex(const Anope::string &expr) : Regex(expr) + { + const char *error; + int erroffset; + this->regex = pcre_compile(expr.c_str(), PCRE_CASELESS, &error, &erroffset, NULL); + if (!this->regex) + throw RegexException("Error in regex " + expr + " at offset " + stringify(erroffset) + ": " + error); + } + + ~PCRERegex() + { + pcre_free(this->regex); + } + + bool Matches(const Anope::string &str) + { + return pcre_exec(this->regex, NULL, str.c_str(), str.length(), 0, 0, NULL, 0) > -1; + } +}; + +class PCRERegexProvider : public RegexProvider +{ + public: + PCRERegexProvider(Module *creator) : RegexProvider(creator, "regex/pcre") { } + + Regex *Compile(const Anope::string &expression) anope_override + { + return new PCRERegex(expression); + } +}; + +class ModuleRegexPCRE : public Module +{ + PCRERegexProvider pcre_regex_provider; + + public: + ModuleRegexPCRE(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, SUPPORTED), + pcre_regex_provider(this) + { + this->SetAuthor("Anope"); + this->SetPermanent(true); + } +}; + +MODULE_INIT(ModuleRegexPCRE) diff --git a/modules/extra/m_regex_posix.cpp b/modules/extra/m_regex_posix.cpp new file mode 100644 index 000000000..409a057ba --- /dev/null +++ b/modules/extra/m_regex_posix.cpp @@ -0,0 +1,57 @@ +#include "module.h" +#include <sys/types.h> +#include <regex.h> + +class POSIXRegex : public Regex +{ + regex_t regbuf; + + public: + POSIXRegex(const Anope::string &expr) : Regex(expr) + { + int err = regcomp(&this->regbuf, expr.c_str(), REG_EXTENDED | REG_NOSUB); + if (err) + { + char buf[BUFSIZE]; + regerror(err, &this->regbuf, buf, sizeof(buf)); + regfree(&this->regbuf); + throw RegexException("Error in regex " + expr + ": " + buf); + } + } + + ~POSIXRegex() + { + regfree(&this->regbuf); + } + + bool Matches(const Anope::string &str) + { + return regexec(&this->regbuf, str.c_str(), 0, NULL, 0) == 0; + } +}; + +class POSIXRegexProvider : public RegexProvider +{ + public: + POSIXRegexProvider(Module *creator) : RegexProvider(creator, "regex/posix") { } + + Regex *Compile(const Anope::string &expression) anope_override + { + return new POSIXRegex(expression); + } +}; + +class ModuleRegexPOSIX : public Module +{ + POSIXRegexProvider posix_regex_provider; + + public: + ModuleRegexPOSIX(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, SUPPORTED), + posix_regex_provider(this) + { + this->SetAuthor("Anope"); + this->SetPermanent(true); + } +}; + +MODULE_INIT(ModuleRegexPOSIX) diff --git a/modules/extra/m_regex_tre.cpp b/modules/extra/m_regex_tre.cpp new file mode 100644 index 000000000..8cfbd3b18 --- /dev/null +++ b/modules/extra/m_regex_tre.cpp @@ -0,0 +1,58 @@ +/* RequiredLibraries: tre */ + +#include "module.h" +#include <tre/regex.h> + +class TRERegex : public Regex +{ + regex_t regbuf; + + public: + TRERegex(const Anope::string &expr) : Regex(expr) + { + int err = regcomp(&this->regbuf, expr.c_str(), REG_EXTENDED | REG_NOSUB); + if (err) + { + char buf[BUFSIZE]; + regerror(err, &this->regbuf, buf, sizeof(buf)); + regfree(&this->regbuf); + throw RegexException("Error in regex " + expr + ": " + buf); + } + } + + ~TRERegex() + { + regfree(&this->regbuf); + } + + bool Matches(const Anope::string &str) + { + return regexec(&this->regbuf, str.c_str(), 0, NULL, 0) == 0; + } +}; + +class TRERegexProvider : public RegexProvider +{ + public: + TRERegexProvider(Module *creator) : RegexProvider(creator, "regex/tre") { } + + Regex *Compile(const Anope::string &expression) anope_override + { + return new TRERegex(expression); + } +}; + +class ModuleRegexTRE : public Module +{ + TRERegexProvider tre_regex_provider; + + public: + ModuleRegexTRE(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, SUPPORTED), + tre_regex_provider(this) + { + this->SetAuthor("Anope"); + this->SetPermanent(true); + } +}; + +MODULE_INIT(ModuleRegexTRE) |
