]> git.cworth.org Git - apitrace/blobdiff - trace_parser.cpp
Merge remote-tracking branch 'origin/master' into on-demand-loading
[apitrace] / trace_parser.cpp
index f3f4c4f15f17fcfb95f7e65b87b32815f3de79c7..44d1786ac207fe2fa576a88c9cfae90339013fdc 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 
 #include "trace_file.hpp"
+#include "trace_snappyfile.hpp"
 #include "trace_parser.hpp"
 
 
@@ -39,7 +40,7 @@ namespace Trace {
 
 
 Parser::Parser() {
-    file = new Trace::ZLibFile;
+    file = NULL;
     next_call_no = 0;
     version = 0;
 }
@@ -47,11 +48,17 @@ Parser::Parser() {
 
 Parser::~Parser() {
     close();
-    delete file;
 }
 
 
 bool Parser::open(const char *filename) {
+    assert(!file);
+    if (File::isZLibCompressed(filename)) {
+        file = new ZLibFile;
+    } else {
+        file = new SnappyFile;
+    }
+
     if (!file->open(filename, File::Read)) {
         return false;
     }
@@ -77,13 +84,18 @@ deleteAll(Iter begin, Iter end)
 
 template <typename Container>
 inline void
-deleteAll(const Container &c)
+deleteAll(Container &c)
 {
     deleteAll(c.begin(), c.end());
+    c.clear();
 }
 
 void Parser::close(void) {
-    file->close();
+    if (file) {
+        file->close();
+        delete file;
+        file = NULL;
+    }
 
     deleteAll(calls);
     deleteAll(functions);
@@ -195,7 +207,8 @@ bool Parser::parse_call_details(Call *call) {
             call->ret = parse_value();
             break;
         default:
-            std::cerr << "error: unknown call detail " << c << "\n";
+            std::cerr << "error: ("<<call->name()<< ") unknown call detail "
+                      << c << "\n";
             exit(1);
         case -1:
             return false;