X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_parser.cpp;h=47d5a7a865771e3025b2f1cc674bda2aea8c1173;hb=75e8c9b7c7f2f10d9b7f479d45f58d81ea729d30;hp=a9f9e78f5647f60ec2f726b3fd5ef4f4fe33691a;hpb=1b23ed28505a34cda19b5cc1b7578e63c0c63237;p=apitrace diff --git a/trace_parser.cpp b/trace_parser.cpp index a9f9e78..47d5a7a 100644 --- a/trace_parser.cpp +++ b/trace_parser.cpp @@ -28,8 +28,8 @@ #include #include -#include - +#include "trace_file.hpp" +#include "trace_snappyfile.hpp" #include "trace_parser.hpp" @@ -52,8 +52,14 @@ Parser::~Parser() { bool Parser::open(const char *filename) { - file = gzopen(filename, "rb"); - if (!file) { + assert(!file); + if (File::isZLibCompressed(filename)) { + file = new ZLibFile; + } else { + file = new SnappyFile; + } + + if (!file->open(filename, File::Read)) { return false; } @@ -85,7 +91,8 @@ deleteAll(const Container &c) void Parser::close(void) { if (file) { - gzclose(file); + file->close(); + delete file; file = NULL; } @@ -137,14 +144,17 @@ T *lookup(std::vector &map, size_t index) { void Parser::parse_enter(void) { size_t id = read_uint(); - Call::Signature *sig = lookup(functions, id); + FunctionSig *sig = lookup(functions, id); if (!sig) { - sig = new Call::Signature; + sig = new FunctionSig; + sig->id = id; sig->name = read_string(); - unsigned size = read_uint(); - for (unsigned i = 0; i < size; ++i) { - sig->arg_names.push_back(read_string()); + sig->num_args = read_uint(); + const char **arg_names = new const char *[sig->num_args]; + for (unsigned i = 0; i < sig->num_args; ++i) { + arg_names[i] = read_string(); } + sig->arg_names = arg_names; functions[id] = sig; } assert(sig); @@ -196,7 +206,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: ("<name()<< ") unknown call detail " + << c << "\n"; exit(1); case -1: return false; @@ -290,14 +301,14 @@ Value *Parser::parse_uint() { Value *Parser::parse_float() { float value; - gzread(file, &value, sizeof value); + file->read(&value, sizeof value); return new Float(value); } Value *Parser::parse_double() { double value; - gzread(file, &value, sizeof value); + file->read(&value, sizeof value); return new Float(value); } @@ -328,19 +339,18 @@ Value *Parser::parse_bitmask() { size_t id = read_uint(); BitmaskSig *sig = lookup(bitmasks, id); if (!sig) { - size_t count = read_uint(); - BitmaskVal *values = new BitmaskVal[count]; - for (BitmaskVal *it = values; it != values + count; ++it) { + sig = new BitmaskSig; + sig->id = id; + sig->num_flags = read_uint(); + BitmaskFlag *flags = new BitmaskFlag[sig->num_flags]; + for (BitmaskFlag *it = flags; it != flags + sig->num_flags; ++it) { it->name = read_string(); it->value = read_uint(); - if (it->value == 0 && it != values) { + if (it->value == 0 && it != flags) { std::cerr << "warning: bitmask " << it->name << " is zero but is not first flag\n"; } } - sig = new BitmaskSig; - sig->id = id; - sig->count = count; - sig->values = values; + sig->flags = flags; bitmasks[id] = sig; } assert(sig); @@ -365,7 +375,7 @@ Value *Parser::parse_blob(void) { size_t size = read_uint(); Blob *blob = new Blob(size); if (size) { - gzread(file, blob->buf, (unsigned)size); + file->read(blob->buf, (unsigned)size); } return blob; } @@ -410,7 +420,7 @@ const char * Parser::read_string(void) { size_t len = read_uint(); char * value = new char[len + 1]; if (len) { - gzread(file, value, (unsigned)len); + file->read(value, (unsigned)len); } value[len] = 0; #if TRACE_VERBOSE @@ -425,7 +435,7 @@ unsigned long long Parser::read_uint(void) { int c; unsigned shift = 0; do { - c = gzgetc(file); + c = file->getc(); if (c == -1) { break; } @@ -440,7 +450,7 @@ unsigned long long Parser::read_uint(void) { inline int Parser::read_byte(void) { - int c = gzgetc(file); + int c = file->getc(); #if TRACE_VERBOSE if (c < 0) std::cerr << "\tEOF" << "\n";