X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Ftraceloader.cpp;fp=gui%2Ftraceloader.cpp;h=41d4a9bebe6b736ca5dd30039c365cbed60240c0;hb=121e3164e0ed7ab91947bd8325e03095dcfcb823;hp=11847fff975b4ed5386df43ce41c191f9eb5142a;hpb=8f98c3a529e7ef88e4111ef22cf8411916a9a065;p=apitrace diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index 11847ff..41d4a9b 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -308,6 +308,67 @@ void TraceLoader::searchPrev(int startFrame, const QString &str, Qt::CaseSensitivity sensitivity) { + Q_ASSERT(m_parser.supportsOffsets()); + if (m_parser.supportsOffsets()) { + Trace::Call *call = 0; + QList frameCalls; + int frameIdx = startFrame; + + const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx]; + int numCallsToParse = frameBookmark.numberOfCalls; + m_parser.setBookmark(frameBookmark.start); + + while ((call = m_parser.parse_call())) { + + frameCalls.append(call); + --numCallsToParse; + + if (numCallsToParse == 0) { + bool foundCall = searchCallsBackwards(frameCalls, + frameIdx, + str, sensitivity); + + qDeleteAll(frameCalls); + frameCalls.clear(); + if (foundCall) { + return; + } + + --frameIdx; + + if (frameIdx >= 0) { + const FrameBookmark &frameBookmark = + m_frameBookmarks[frameIdx]; + m_parser.setBookmark(frameBookmark.start); + numCallsToParse = frameBookmark.numberOfCalls; + } + } + } + } + emit searchResult(ApiTrace::SearchNotFound, 0); +} + +bool TraceLoader::searchCallsBackwards(const QList &calls, + int frameIdx, + const QString &str, + Qt::CaseSensitivity sensitivity) +{ + for (int i = calls.count() - 1; i >= 0; --i) { + Trace::Call *call = calls[i]; + if (callContains(call, str, sensitivity)) { + ApiTraceFrame *frame = m_createdFrames[frameIdx]; + const QVector apiCalls = + fetchFrameContents(frame); + for (int i = 0; i < apiCalls.count(); ++i) { + if (apiCalls[i]->index() == call->no) { + emit searchResult(ApiTrace::SearchFound, apiCalls[i]); + break; + } + } + return true; + } + } + return false; } int TraceLoader::callInFrame(int callIdx) const