31 #include <QDataStream>
46 #ifndef PCRE_STUDY_JIT_COMPILE
47 #define PCRE_STUDY_JIT_COMPILE 0
56 Qt::CaseSensitivity CS_;
64 PCREWrapper (
const QString& str, Qt::CaseSensitivity cs)
65 : RE_ (Compile (str, cs))
72 pcre_refcount (RE_, 1);
73 const char *error = 0;
74 const int opts = PCRE_STUDY_JIT_COMPILE;
75 Extra_ = pcre_study (RE_, opts, &error);
79 PCREWrapper (
const PCREWrapper& other)
86 PCREWrapper& operator= (
const PCREWrapper& other)
88 if (RE_ && !pcre_refcount (RE_, -1))
95 Extra_ = other.Extra_;
97 pcre_refcount (RE_, 1);
107 if (!pcre_refcount (RE_, -1))
114 const QString& GetPattern ()
const
119 Qt::CaseSensitivity GetCS ()
const
124 int Exec (
const QByteArray& utf8)
const
126 return RE_ ? pcre_exec (RE_, Extra_, utf8.constData (), utf8.size (), 0, 0, NULL, 0) : -1;
129 pcre* Compile (
const QString& str, Qt::CaseSensitivity cs)
131 const char *error = 0;
133 int options = PCRE_UTF8;
134 if (cs == Qt::CaseInsensitive)
135 options |= PCRE_CASELESS;
136 auto re = pcre_compile (str.toUtf8 ().constData (), options, &error, &errOffset, NULL);
138 qWarning () << Q_FUNC_INFO
139 <<
"failed compiling"
148 #ifdef PCRE_CONFIG_JIT
149 pcre_free_study (Extra_);
159 struct RegExpRegisterGuard
161 RegExpRegisterGuard ()
163 qRegisterMetaType<RegExp> (
"Util::RegExp");
164 qRegisterMetaTypeStreamOperators<RegExp> ();
191 : Impl_ {
new RegExpImpl { QRegExp { str, cs, QRegExp::RegExp } } }
202 return Impl_->PRx_.Exec (str.toUtf8 ()) >= 0;
204 return Impl_->Rx_.exactMatch (str);
214 return Impl_->PRx_.GetPattern ();
216 return Impl_->Rx_.pattern ();
226 return Impl_->PRx_.GetCS ();
228 return Impl_->Rx_.caseSensitivity ();
236 out << static_cast<quint8> (1);
248 qWarning () << Q_FUNC_INFO
Qt::CaseSensitivity GetCaseSensitivity() const
QString GetPattern() const
QDataStream & operator>>(QDataStream &in, LeechCraft::Util::RegExp &rx)
QDataStream & operator<<(QDataStream &out, const LeechCraft::Util::RegExp &rx)
bool Matches(const QString &) const