X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.cpp;h=45473b345ffa3a3cae447ccab1fe101e93f91514;hb=ebf971eec6c3a5f98885cc418e04690ba213b645;hp=517e2219cf70fdd8924d9844dca7a0e14aaf9036;hpb=20b1f6dc3783cec612fe3712c4b6c1ca65d4a5f4;p=apitrace diff --git a/trace_file.cpp b/trace_file.cpp index 517e221..45473b3 100644 --- a/trace_file.cpp +++ b/trace_file.cpp @@ -97,6 +97,12 @@ bool File::isSnappyCompressed(const std::string &filename) return (byte1 == SNAPPY_BYTE1 && byte2 == SNAPPY_BYTE2); } +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + FILE *file; /* .gz file */ +} gz_dummy_stream; ZLibFile::ZLibFile(const std::string &filename, File::Mode mode) @@ -115,8 +121,15 @@ bool ZLibFile::rawOpen(const std::string &filename, File::Mode mode) (mode == File::Write) ? "wb" : "rb"); if (mode == File::Read && m_gzFile) { - m_endOffset = gzseek(m_gzFile, 0, SEEK_END); - gzrewind(m_gzFile); + //XXX: unfortunately zlib doesn't support + // SEEK_END or we could've done: + //m_endOffset = gzseek(m_gzFile, 0, SEEK_END); + //gzrewind(m_gzFile); + gz_dummy_stream *stream = (gz_dummy_stream *)m_gzFile; + long loc = ftell(stream->file); + fseek(stream->file,0,SEEK_END); + m_endOffset = ftell(stream->file); + fseek(stream->file, loc, SEEK_SET); } return m_gzFile != NULL; @@ -163,5 +176,6 @@ bool ZLibFile::rawSkip(size_t) int ZLibFile::rawPercentRead() { - return 100 * (gztell(m_gzFile) / m_endOffset); + gz_dummy_stream *stream = (gz_dummy_stream *)m_gzFile; + return 100 * (ftell(stream->file) / m_endOffset); }