From f82a26ea256fc589c34f2d88723bd7754c87e745 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 2 Jun 2021 17:54:17 +0100 Subject: [PATCH] Add a regex filter function --- qrenderdoc/Windows/EventBrowser.cpp | 70 +++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index b1c73b56e..cc0c1f206 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include #include #include @@ -1263,6 +1265,7 @@ public: MAKE_BUILTIN_FILTER(any); MAKE_BUILTIN_FILTER(all); + MAKE_BUILTIN_FILTER(regex); MAKE_BUILTIN_FILTER(param); MAKE_BUILTIN_FILTER(event); MAKE_BUILTIN_FILTER(draw); @@ -1509,6 +1512,73 @@ private: return NULL; } + IEventBrowser::EventFilterCallback filterFunction_regex(QString name, QString parameters, + ParseTrace &trace) + { + parameters = parameters.trimmed(); + + if(parameters.size() < 2 || parameters[0] != QLatin1Char('/')) + { + trace.setError(tr("Parameter to to regex() should be /regex/", "EventFilterModel")); + return NULL; + } + + int end = 0; + + for(int i = 1; i < parameters.size(); i++) + { + if(parameters[i] == QLatin1Char('\\')) + { + i++; + continue; + } + + if(parameters[i] == QLatin1Char('/')) + { + end = i; + break; + } + } + + if(end == 0) + { + trace.setError(tr("Unterminated regex", "EventFilterModel")); + return NULL; + } + + QString opts = parameters.right(parameters.size() - end - 1); + + QRegularExpression::PatternOptions reOpts = QRegularExpression::NoPatternOption; + + for(QChar c : opts) + { + switch(c.toLatin1()) + { + case 'i': reOpts |= QRegularExpression::CaseInsensitiveOption; break; + case 's': reOpts |= QRegularExpression::DotMatchesEverythingOption; break; + case 'x': reOpts |= QRegularExpression::ExtendedPatternSyntaxOption; break; + case 'u': reOpts |= QRegularExpression::UseUnicodePropertiesOption; break; + default: + trace.setError(tr("Unexpected option '%1' after regex", "EventFilterModel").arg(c)); + return NULL; + } + } + + QRegularExpression regex(parameters.mid(1, end - 1)); + + if(!regex.isValid()) + { + trace.setError(tr("Invalid regex", "EventFilterModel")); + return NULL; + } + + return [regex](ICaptureContext *, const rdcstr &, const rdcstr &, uint32_t, const SDChunk *, + const DrawcallDescription *, const rdcstr &name) { + QRegularExpressionMatch match = regex.match(QString(name)); + return match.isValid() && match.hasMatch(); + }; + } + IEventBrowser::EventFilterCallback filterFunction_param(QString name, QString parameters, ParseTrace &trace) {