10 #include <QDataStream>
25 #ifndef PCRE_STUDY_JIT_COMPILE
26 #define PCRE_STUDY_JIT_COMPILE 0
32 pcre_extra *Extra_ =
nullptr;
35 Qt::CaseSensitivity CS_ = Qt::CaseSensitive;
37 PCREWrapper () =
default;
39 PCREWrapper (
const QString& str, Qt::CaseSensitivity cs)
40 : RE_ (Compile (str, cs))
46 pcre_refcount (RE_, 1);
47 const char *error = 0;
48 const int opts = PCRE_STUDY_JIT_COMPILE;
49 Extra_ = pcre_study (RE_, opts, &error);
53 PCREWrapper (
const PCREWrapper& other)
58 PCREWrapper& operator= (
const PCREWrapper& other)
60 if (RE_ && !pcre_refcount (RE_, -1))
67 Extra_ = other.Extra_;
69 pcre_refcount (RE_, 1);
79 if (!pcre_refcount (RE_, -1))
86 const QString& GetPattern ()
const
91 Qt::CaseSensitivity GetCS ()
const
96 int Exec (
const QByteArray& utf8)
const
98 return RE_ ? pcre_exec (RE_, Extra_, utf8.constData (), utf8.size (), 0, 0, NULL, 0) : -1;
101 pcre* Compile (
const QString& str, Qt::CaseSensitivity cs)
103 const char *error = 0;
105 int options = PCRE_UTF8;
106 if (cs == Qt::CaseInsensitive)
107 options |= PCRE_CASELESS;
108 auto re = pcre_compile (str.toUtf8 ().constData (), options, &error, &errOffset, NULL);
110 qWarning () << Q_FUNC_INFO
111 <<
"failed compiling"
120 #ifdef PCRE_CONFIG_JIT
121 pcre_free_study (Extra_);
131 struct RegExpRegisterGuard
133 RegExpRegisterGuard ()
135 qRegisterMetaType<RegExp> (
"Util::RegExp");
136 qRegisterMetaTypeStreamOperators<RegExp> ();
163 : Impl_ {
new RegExpImpl { QRegExp { str, cs, QRegExp::RegExp } } }
174 return Impl_->PRx_.Exec (str.toUtf8 ()) >= 0;
176 return Impl_->Rx_.exactMatch (str);
186 return Impl_->PRx_.Exec (ba) >= 0;
188 return Impl_->Rx_.exactMatch (ba);
198 return Impl_->PRx_.GetPattern ();
200 return Impl_->Rx_.pattern ();
210 return Impl_->PRx_.GetCS ();
212 return Impl_->Rx_.caseSensitivity ();
220 out << static_cast<quint8> (1);
232 qWarning () << Q_FUNC_INFO