]> git.cworth.org Git - apitrace/commitdiff
Implement find prev.
authorZack Rusin <zack@kde.org>
Tue, 13 Sep 2011 05:35:12 +0000 (01:35 -0400)
committerZack Rusin <zack@kde.org>
Tue, 13 Sep 2011 05:35:12 +0000 (01:35 -0400)
and fix a bug in find next. now both find next and find prev work.

gui/apitrace.cpp
gui/traceloader.cpp
gui/traceloader.h

index bff1686a9a3076add8058fcad199a483b9b5e873..51520c5e85df38cb2305914b7e798e714355cadc 100644 (file)
@@ -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;
             }
         }
     }
index 11847fff975b4ed5386df43ce41c191f9eb5142a..41d4a9bebe6b736ca5dd30039c365cbed60240c0 100644 (file)
@@ -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<Trace::Call*> 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<Trace::Call*> &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<ApiTraceCall*> 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
index c83cf47bef611212898813cd5e6b6674268b9241..bcbc03b90e990ffffb6cc5fa16ddc7ba9ce24f4b 100644 (file)
@@ -72,6 +72,10 @@ private:
                       const QString &str,
                       Qt::CaseSensitivity sensitivity);
      QVector<ApiTraceCall*> fetchFrameContents(ApiTraceFrame *frame);
+     bool searchCallsBackwards(const QList<Trace::Call*> &calls,
+                               int frameIdx,
+                               const QString &str,
+                               Qt::CaseSensitivity sensitivity);
 
 private:
     Trace::Parser m_parser;