diff options
Diffstat (limited to 'src/boost/libs/regex/performance/pcre.cpp')
-rw-r--r-- | src/boost/libs/regex/performance/pcre.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/boost/libs/regex/performance/pcre.cpp b/src/boost/libs/regex/performance/pcre.cpp new file mode 100644 index 000000000..878a5cad9 --- /dev/null +++ b/src/boost/libs/regex/performance/pcre.cpp @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////// +// Copyright 2015 John Maddock. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_ +// + +#ifdef TEST_PCRE2 + +#define PCRE2_STATIC +#define PCRE2_CODE_UNIT_WIDTH 8 + +#include "performance.hpp" +#include <pcre2.h> +#include <boost/version.hpp> +#include <boost/lexical_cast.hpp> + +struct pcre_regex : public abstract_regex +{ +private: + pcre2_code* pe; + pcre2_match_data* pdata; +public: + pcre_regex() + : pe(0) + { + pdata = pcre2_match_data_create(30, NULL); + } + ~pcre_regex() + { + if(pe) + pcre2_code_free(pe); + pcre2_match_data_free(pdata); + } + virtual bool set_expression(const char* pat, bool isperl) + { + if(!isperl) + return false; + if(pe) + pcre2_code_free(pe); + int errorcode = 0; + PCRE2_SIZE erroroffset; + pe = pcre2_compile((PCRE2_SPTR)pat, std::strlen(pat), PCRE2_MULTILINE, &errorcode, &erroroffset, NULL); + return pe ? true : false; + } + virtual bool match_test(const char* text); + virtual unsigned find_all(const char* text); + virtual std::string name(); + + struct initializer + { + initializer() + { + pcre_regex::register_instance(boost::shared_ptr<abstract_regex>(new pcre_regex)); + } + void do_nothing()const {} + }; + static const initializer init; +}; + +const pcre_regex::initializer pcre_regex::init; + + +bool pcre_regex::match_test(const char * text) +{ + int r = pcre2_match(pe, (PCRE2_SPTR)text, std::strlen(text), 0, PCRE2_ANCHORED, pdata, NULL); + return r >= 0; +} + +unsigned pcre_regex::find_all(const char * text) +{ + unsigned count = 0; + int flags = 0; + const char* end = text + std::strlen(text); + while(pcre2_match(pe, (PCRE2_SPTR)text, end - text, 0, flags, pdata, NULL) >= 0) + { + ++count; + PCRE2_SIZE* v = pcre2_get_ovector_pointer(pdata); + text += v[1]; + if(v[0] == v[1]) + ++text; + if(*text) + { + flags = *(text - 1) == '\n' ? 0 : PCRE2_NOTBOL; + } + } + return count; +} + +std::string pcre_regex::name() +{ + init.do_nothing(); + return std::string("PCRE-") + boost::lexical_cast<std::string>(PCRE2_MAJOR) + "." + boost::lexical_cast<std::string>(PCRE2_MINOR); +} + +#endif |