From af214b3aa0b8c1f9ed1a0e29891bce1c025590a2 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Mon, 14 Jan 2013 18:07:23 +0100 Subject: [PATCH] small wildcard/regexp wrapper --- src/utils/strmatcher.cpp | 90 +++++++++++++++++++++++++++++++++++++ src/utils/strmatcher.h | 95 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/utils/strmatcher.cpp create mode 100644 src/utils/strmatcher.h diff --git a/src/utils/strmatcher.cpp b/src/utils/strmatcher.cpp new file mode 100644 index 00000000..098242f2 --- /dev/null +++ b/src/utils/strmatcher.cpp @@ -0,0 +1,90 @@ +/* Copyright (C) 2012 J.F.Dockes + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "autoconfig.h" + +#include +#include +#include +#include + +#include +using std::string; + +#include "cstr.h" + +#include "strmatcher.h" + +bool StrWildMatcher::match(const string& val) const +{ + return fnmatch(m_sexp.c_str(), val.c_str(), 0) != FNM_NOMATCH; +} + +string::size_type StrWildMatcher::baseprefixlen() const +{ + return m_sexp.find_first_of(cstr_wildSpecStChars); +} + +StrRegexpMatcher::StrRegexpMatcher(const string& exp) + : StrMatcher(exp), m_compiled(0), m_errcode(0) +{ + setExp(exp); +} + +bool StrRegexpMatcher::setExp(const string& exp) +{ + if (m_compiled) { + regfree((regex_t*)m_compiled); + delete (regex_t*)m_compiled; + } + m_compiled = new regex_t; + if ((m_errcode = + regcomp((regex_t*)m_compiled, exp.c_str(), REG_EXTENDED|REG_NOSUB))) { + char errbuf[200]; + regerror(m_errcode, (regex_t*)m_compiled, errbuf, 199); + m_reason = string("StrRegexpMatcher:regcomp failed for ") + + exp + string(errbuf); + return false; + } + m_sexp = exp; + return true; +} + +StrRegexpMatcher::~StrRegexpMatcher() +{ + if (m_compiled) { + regfree((regex_t*)m_compiled); + delete (regex_t*)m_compiled; + } +} + +bool StrRegexpMatcher::match(const string& val) const +{ + if (m_errcode) + return false; + return regexec((regex_t*)m_compiled, val.c_str(), 0, 0, 0) != REG_NOMATCH; +} + +string::size_type StrRegexpMatcher::baseprefixlen() const +{ + return m_sexp.find_first_of(cstr_regSpecStChars); +} + +bool StrRegexpMatcher::ok() const +{ + return !m_errcode; +} diff --git a/src/utils/strmatcher.h b/src/utils/strmatcher.h new file mode 100644 index 00000000..3df43f8a --- /dev/null +++ b/src/utils/strmatcher.h @@ -0,0 +1,95 @@ +/* Copyright (C) 2012 J.F.Dockes + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _STRMATCHER_H_INCLUDED_ +#define _STRMATCHER_H_INCLUDED_ + +#include + +// Encapsulating simple wildcard/regexp string matching. + +// Matcher class. Interface to either wildcard or regexp yes/no matcher +class StrMatcher { +public: + StrMatcher(const std::string& exp) + : m_sexp(exp) + { + } + virtual ~StrMatcher() {}; + virtual bool match(const std::string &val) const = 0; + virtual std::string::size_type baseprefixlen() const = 0; + virtual bool setExp(const std::string& newexp) + { + m_sexp = newexp; + return true; + } + virtual bool ok() const + { + return true; + } + virtual const std::string& exp() + { + return m_sexp; + } + virtual StrMatcher *clone() = 0; + const string& getreason() + { + return m_reason; + } +protected: + std::string m_sexp; + std::string m_reason; +}; + +class StrWildMatcher : public StrMatcher { +public: + StrWildMatcher(const std::string& exp) + : StrMatcher(exp) + { + } + virtual ~StrWildMatcher() + { + } + virtual bool match(const std::string& val) const; + virtual std::string::size_type baseprefixlen() const; + virtual StrWildMatcher *clone() + { + return new StrWildMatcher(m_sexp); + } +}; + +class StrRegexpMatcher : public StrMatcher { +public: + StrRegexpMatcher(const std::string& exp); + virtual bool setExp(const std::string& newexp); + virtual ~StrRegexpMatcher(); + virtual bool match(const std::string& val) const; + virtual std::string::size_type baseprefixlen() const; + virtual bool ok() const; + virtual StrRegexpMatcher *clone() + { + return new StrRegexpMatcher(m_sexp); + } + const string& getreason() + { + return m_reason; + } +private: + void *m_compiled; + bool m_errcode; +}; + +#endif /* _STRMATCHER_H_INCLUDED_ */