fixed GH #1581: Cannot find 'pcre.h' when using POCO_UNBUNDLED, a non-system PCRE, and CMake

This commit is contained in:
Guenter Obiltschnig
2017-02-11 12:03:37 +01:00
parent 43a0490a70
commit f8a0bbff1b
2 changed files with 10 additions and 22 deletions

View File

@@ -27,20 +27,6 @@
#include <vector> #include <vector>
#if defined(POCO_UNBUNDLED)
#include <pcre.h>
#else
//
// Copy these definitions from pcre.h
// to avoid pulling in the entire header file
//
extern "C"
{
typedef struct real_pcre8_or_16 pcre;
struct pcre_extra;
}
#endif
namespace Poco { namespace Poco {
@@ -211,8 +197,10 @@ protected:
std::string::size_type substOne(std::string& subject, std::string::size_type offset, const std::string& replacement, int options) const; std::string::size_type substOne(std::string& subject, std::string::size_type offset, const std::string& replacement, int options) const;
private: private:
pcre* _pcre; // Note: to avoid a dependency on the pcre.h header the following are
pcre_extra* _extra; // declared as void* and casted to the correct type in the implementation file.
void* _pcre; // Actual type is pcre*
void* _extra; // Actual type is struct pcre_extra*
static const int OVEC_SIZE; static const int OVEC_SIZE;

View File

@@ -43,14 +43,14 @@ RegularExpression::RegularExpression(const std::string& pattern, int options, bo
throw RegularExpressionException(msg.str()); throw RegularExpressionException(msg.str());
} }
if (study) if (study)
_extra = pcre_study(_pcre, 0, &error); _extra = pcre_study(reinterpret_cast<pcre*>(_pcre), 0, &error);
} }
RegularExpression::~RegularExpression() RegularExpression::~RegularExpression()
{ {
if (_pcre) pcre_free(_pcre); if (_pcre) pcre_free(reinterpret_cast<pcre*>(_pcre));
if (_extra) pcre_free(_extra); if (_extra) pcre_free(reinterpret_cast<struct pcre_extra*>(_extra));
} }
@@ -59,7 +59,7 @@ int RegularExpression::match(const std::string& subject, std::string::size_type
poco_assert (offset <= subject.length()); poco_assert (offset <= subject.length());
int ovec[OVEC_SIZE]; int ovec[OVEC_SIZE];
int rc = pcre_exec(_pcre, _extra, subject.c_str(), int(subject.size()), int(offset), options & 0xFFFF, ovec, OVEC_SIZE); int rc = pcre_exec(reinterpret_cast<pcre*>(_pcre), reinterpret_cast<struct pcre_extra*>(_extra), subject.c_str(), int(subject.size()), int(offset), options & 0xFFFF, ovec, OVEC_SIZE);
if (rc == PCRE_ERROR_NOMATCH) if (rc == PCRE_ERROR_NOMATCH)
{ {
mtch.offset = std::string::npos; mtch.offset = std::string::npos;
@@ -93,7 +93,7 @@ int RegularExpression::match(const std::string& subject, std::string::size_type
matches.clear(); matches.clear();
int ovec[OVEC_SIZE]; int ovec[OVEC_SIZE];
int rc = pcre_exec(_pcre, _extra, subject.c_str(), int(subject.size()), int(offset), options & 0xFFFF, ovec, OVEC_SIZE); int rc = pcre_exec(reinterpret_cast<pcre*>(_pcre), reinterpret_cast<struct pcre_extra*>(_extra), subject.c_str(), int(subject.size()), int(offset), options & 0xFFFF, ovec, OVEC_SIZE);
if (rc == PCRE_ERROR_NOMATCH) if (rc == PCRE_ERROR_NOMATCH)
{ {
return 0; return 0;
@@ -206,7 +206,7 @@ std::string::size_type RegularExpression::substOne(std::string& subject, std::st
if (offset >= subject.length()) return std::string::npos; if (offset >= subject.length()) return std::string::npos;
int ovec[OVEC_SIZE]; int ovec[OVEC_SIZE];
int rc = pcre_exec(_pcre, _extra, subject.c_str(), int(subject.size()), int(offset), options & 0xFFFF, ovec, OVEC_SIZE); int rc = pcre_exec(reinterpret_cast<pcre*>(_pcre), reinterpret_cast<struct pcre_extra*>(_extra), subject.c_str(), int(subject.size()), int(offset), options & 0xFFFF, ovec, OVEC_SIZE);
if (rc == PCRE_ERROR_NOMATCH) if (rc == PCRE_ERROR_NOMATCH)
{ {
return std::string::npos; return std::string::npos;