X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_parser.cpp;h=44d1786ac207fe2fa576a88c9cfae90339013fdc;hb=dc792082bcdd4b761af6b22e67570098ebf9f3f2;hp=17682bd2a1ebad840613ebea90ab1b6890466931;hpb=31b183ac653e9ba1e19cbc9b9292e36c660bcb24;p=apitrace diff --git a/trace_parser.cpp b/trace_parser.cpp index 17682bd..44d1786 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; } @@ -78,14 +84,16 @@ deleteAll(Iter begin, Iter end) template inline void -deleteAll(const Container &c) +deleteAll(Container &c) { deleteAll(c.begin(), c.end()); + c.clear(); } void Parser::close(void) { if (file) { - gzclose(file); + file->close(); + delete file; file = NULL; } @@ -137,14 +145,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 +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: ("<name()<< ") unknown call detail " + << c << "\n"; exit(1); case -1: return false; @@ -290,14 +302,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); } @@ -309,11 +321,14 @@ Value *Parser::parse_string() { Value *Parser::parse_enum() { size_t id = read_uint(); - Enum::Signature *sig = lookup(enums, id); + EnumSig *sig = lookup(enums, id); if (!sig) { - const char *name = read_string(); + sig = new EnumSig; + sig->id = id; + sig->name = read_string(); Value *value = parse_value(); - sig = new Enum::Signature(name, value); + sig->value = value->toSInt(); + delete value; enums[id] = sig; } assert(sig); @@ -323,17 +338,20 @@ Value *Parser::parse_enum() { Value *Parser::parse_bitmask() { size_t id = read_uint(); - Bitmask::Signature *sig = lookup(bitmasks, id); + BitmaskSig *sig = lookup(bitmasks, id); if (!sig) { - size_t size = read_uint(); - sig = new Bitmask::Signature(size); - for (Bitmask::Signature::iterator it = sig->begin(); it != sig->end(); ++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 != sig->begin()) { + if (it->value == 0 && it != flags) { std::cerr << "warning: bitmask " << it->name << " is zero but is not first flag\n"; } } + sig->flags = flags; bitmasks[id] = sig; } assert(sig); @@ -358,7 +376,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; } @@ -367,21 +385,24 @@ Value *Parser::parse_blob(void) { Value *Parser::parse_struct() { size_t id = read_uint(); - Struct::Signature *sig = lookup(structs, id); + StructSig *sig = lookup(structs, id); if (!sig) { - sig = new Struct::Signature; + sig = new StructSig; + sig->id = id; sig->name = read_string(); - unsigned size = read_uint(); - for (unsigned i = 0; i < size; ++i) { - sig->member_names.push_back(read_string()); + sig->num_members = read_uint(); + const char **member_names = new const char *[sig->num_members]; + for (unsigned i = 0; i < sig->num_members; ++i) { + member_names[i] = read_string(); } + sig->member_names = member_names; structs[id] = sig; } assert(sig); Struct *value = new Struct(sig); - for (size_t i = 0; i < sig->member_names.size(); ++i) { + for (size_t i = 0; i < sig->num_members; ++i) { value->members[i] = parse_value(); } @@ -400,7 +421,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 @@ -415,7 +436,7 @@ unsigned long long Parser::read_uint(void) { int c; unsigned shift = 0; do { - c = gzgetc(file); + c = file->getc(); if (c == -1) { break; } @@ -430,7 +451,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";