2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-05-31 17:30:54 +00:00
qpdf/libqpdf/qpdf/PCRE.hh
Jay Berkenbilt f3d7c26de1 removed qexc; non-compatible ABI change
git-svn-id: svn+q:///qpdf/trunk@709 71b93d88-0707-0410-a8cf-f5a4172ac649
2009-09-26 18:36:04 +00:00

119 lines
2.8 KiB
C++

// This is a C++ wrapper class around Philip Hazel's perl-compatible
// regular expressions library.
//
#ifndef __PCRE_HH__
#define __PCRE_HH__
#ifdef _WIN32
# define PCRE_STATIC
#endif
#include <pcre.h>
#include <string>
#include <stdexcept>
#include <qpdf/DLL.hh>
// Note: this class does not encapsulate all features of the PCRE
// package -- only those that I actually need right now are here.
class PCRE
{
public:
// This is thrown when an attempt is made to access a non-existent
// back reference.
class NoBackref: public std::logic_error
{
public:
DLL_EXPORT
NoBackref();
DLL_EXPORT
virtual ~NoBackref() throw() {}
};
class Match
{
friend class PCRE;
public:
DLL_EXPORT
Match(int nbackrefs, char const* subject);
DLL_EXPORT
Match(Match const&);
DLL_EXPORT
Match& operator=(Match const&);
DLL_EXPORT
~Match();
DLL_EXPORT
operator bool();
// All the back reference accessing routines may throw the
// special exception NoBackref (derived from Exception) if the
// back reference does not exist. Exception will be thrown
// for other error conditions. This allows callers to trap
// this condition explicitly when they care about the
// difference between a backreference matching an empty string
// and not matching at all.
// see getMatch flags below
DLL_EXPORT
std::string getMatch(int n, int flags = 0);
DLL_EXPORT
void getOffsetLength(int n, int& offset, int& length);
DLL_EXPORT
int getOffset(int n);
DLL_EXPORT
int getLength(int n);
// nMatches returns the number of available matches including
// match 0 which is the whole string. In other words, if you
// have one backreference in your expression and the
// expression matches, nMatches() will return 2, getMatch(0)
// will return the whole string, getMatch(1) will return the
// text that matched the backreference, and getMatch(2) will
// throw an exception because it is out of range.
DLL_EXPORT
int nMatches() const;
// Flags for getMatch
// getMatch on a substring that didn't match should return
// empty string instead of throwing an exception
static int const gm_no_substring_returns_empty = (1 << 0);
private:
void init(int nmatches, int nbackrefs, char const* subject);
void copy(Match const&);
void destroy();
int nbackrefs;
char const* subject;
int* ovector;
int ovecsize;
int nmatches;
};
// The value passed in as options is passed to pcre_exec. See man
// pcreapi for details.
DLL_EXPORT
PCRE(char const* pattern, int options = 0);
DLL_EXPORT
~PCRE();
DLL_EXPORT
Match match(char const* subject, int options = 0, int startoffset = 0,
int size = -1);
DLL_EXPORT
static void test(int n = 0);
private:
// prohibit copying and assignment
PCRE(PCRE const&);
PCRE& operator=(PCRE const&);
pcre* code;
int nbackrefs;
};
#endif // __PCRE_HH__