31 #include <QDataStream> 46 #ifndef PCRE_STUDY_JIT_COMPILE 47 #define PCRE_STUDY_JIT_COMPILE 0 53 pcre_extra *Extra_ =
nullptr;
56 Qt::CaseSensitivity CS_ = Qt::CaseSensitive;
58 PCREWrapper () =
default;
60 PCREWrapper (
const QString& str, Qt::CaseSensitivity cs)
61 : RE_ (Compile (str, cs))
67 pcre_refcount (RE_, 1);
68 const char *error = 0;
69 const int opts = PCRE_STUDY_JIT_COMPILE;
70 Extra_ = pcre_study (RE_, opts, &error);
74 PCREWrapper (
const PCREWrapper& other)
79 PCREWrapper& operator= (
const PCREWrapper& other)
81 if (RE_ && !pcre_refcount (RE_, -1))
88 Extra_ = other.Extra_;
90 pcre_refcount (RE_, 1);
100 if (!pcre_refcount (RE_, -1))
107 const QString& GetPattern ()
const 112 Qt::CaseSensitivity GetCS ()
const 117 int Exec (
const QByteArray& utf8)
const 119 return RE_ ? pcre_exec (RE_, Extra_, utf8.constData (), utf8.size (), 0, 0, NULL, 0) : -1;
122 pcre* Compile (
const QString& str, Qt::CaseSensitivity cs)
124 const char *error = 0;
126 int options = PCRE_UTF8;
127 if (cs == Qt::CaseInsensitive)
128 options |= PCRE_CASELESS;
129 auto re = pcre_compile (str.toUtf8 ().constData (), options, &error, &errOffset, NULL);
131 qWarning () << Q_FUNC_INFO
132 <<
"failed compiling" 141 #ifdef PCRE_CONFIG_JIT 142 pcre_free_study (Extra_);
152 struct RegExpRegisterGuard
154 RegExpRegisterGuard ()
156 qRegisterMetaType<RegExp> (
"Util::RegExp");
157 qRegisterMetaTypeStreamOperators<RegExp> ();
184 : Impl_ {
new RegExpImpl { QRegExp { str, cs, QRegExp::RegExp } } }
195 return Impl_->PRx_.Exec (str.toUtf8 ()) >= 0;
197 return Impl_->Rx_.exactMatch (str);
207 return Impl_->PRx_.Exec (ba) >= 0;
209 return Impl_->Rx_.exactMatch (ba);
219 return Impl_->PRx_.GetPattern ();
221 return Impl_->Rx_.pattern ();
231 return Impl_->PRx_.GetCS ();
233 return Impl_->Rx_.caseSensitivity ();
241 out << static_cast<quint8> (1);
253 qWarning () << Q_FUNC_INFO
Qt::CaseSensitivity GetCaseSensitivity() const
QDataStream & operator>>(QDataStream &in, LeechCraft::Util::RegExp &rx)
QDataStream & operator<<(QDataStream &out, const LeechCraft::Util::RegExp &rx)
bool Matches(const QString &) const
QString GetPattern() const