76ce33da74
upgrade docs to quickbook 1.7.
96 lines
2.3 KiB
C++
96 lines
2.3 KiB
C++
///////////////////////////////////////////////////////////////
|
|
// 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
|