From: Zack Rusin Date: Tue, 13 Sep 2011 05:35:12 +0000 (-0400) Subject: Implement find prev. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=121e3164e0ed7ab91947bd8325e03095dcfcb823;p=apitrace Implement find prev. and fix a bug in find next. now both find next and find prev work. --- diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index bff1686..51520c5 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -367,6 +367,7 @@ void ApiTrace::findNext(ApiTraceFrame *frame, ApiTraceCall *call = frame->findNextCall(0, str, sensitivity); if (call) { emit findResult(SearchFound, call); + return; } } } @@ -393,7 +394,7 @@ void ApiTrace::findPrev(ApiTraceFrame *frame, frameIdx -= 1; } - for (int i = frameIdx; i <= 0; --i) { + for (int i = frameIdx; i >= 0; --i) { ApiTraceFrame *frame = m_frames[i]; if (!frame->loaded()) { emit loaderSearchPrev(i, str, sensitivity); @@ -402,6 +403,7 @@ void ApiTrace::findPrev(ApiTraceFrame *frame, ApiTraceCall *call = frame->findPrevCall(0, str, sensitivity); if (call) { emit findResult(SearchFound, call); + return; } } } 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 diff --git a/gui/traceloader.h b/gui/traceloader.h index c83cf47..bcbc03b 100644 --- a/gui/traceloader.h +++ b/gui/traceloader.h @@ -72,6 +72,10 @@ private: const QString &str, Qt::CaseSensitivity sensitivity); QVector fetchFrameContents(ApiTraceFrame *frame); + bool searchCallsBackwards(const QList &calls, + int frameIdx, + const QString &str, + Qt::CaseSensitivity sensitivity); private: Trace::Parser m_parser;