00001 #include "GzFileBuf.h"
00002
00003 #include <cstring>
00004 #include <cstdlib>
00005 #include <cstdio>
00006 #include <iostream>
00007
00008 GzFileBuf::GzFileBuf(const char* filename)
00009 {
00010 m_gz_file = gzopen(filename, "rb");
00011 if (m_gz_file == NULL) {
00012 std::cerr << "ERROR: Failed to open " << filename << std::endl;
00013 std::exit(1);
00014 }
00015 setg(m_buf + sizeof(int),
00016 m_buf + sizeof(int),
00017 m_buf + sizeof(int));
00018 }
00019
00020 GzFileBuf::~GzFileBuf()
00021 {
00022 gzclose(m_gz_file);
00023 }
00024
00025 int GzFileBuf::overflow(int_type c)
00026 {
00027 throw;
00028 }
00029
00030
00031 int GzFileBuf::underflow()
00032 {
00033
00034 if (gptr() < egptr()) {
00035 return traits_type::to_int_type(*gptr());
00036 }
00037
00038
00039
00040
00041
00042 unsigned int num_put_back = static_cast<unsigned int>(gptr() - eback());
00043 if (num_put_back > sizeof(int)) {
00044 num_put_back = sizeof(int);
00045 }
00046
00047
00048
00049
00050 std::memmove(m_buf + (sizeof(int) - num_put_back),
00051 gptr() - num_put_back, num_put_back);
00052
00053
00054 const int num = gzread(m_gz_file, m_buf + sizeof(int),
00055 kBufSize - sizeof(int));
00056 if (num <= 0) {
00057
00058 return EOF;
00059 }
00060
00061
00062 setg(m_buf + (sizeof(int) - num_put_back),
00063 m_buf + sizeof(int),
00064 m_buf + sizeof(int) + num);
00065
00066
00067 return traits_type::to_int_type(*gptr());
00068 }
00069
00070 std::streampos GzFileBuf::seekpos(
00071 std::streampos sp,
00072 std::ios_base::openmode which)
00073 {
00074 throw;
00075 }
00076
00077 std::streamsize GzFileBuf::xsgetn(char* s,
00078 std::streamsize num)
00079 {
00080 return static_cast<std::streamsize>(gzread(m_gz_file,s,num));
00081 }
00082
00083 std::streamsize GzFileBuf::xsputn(const char* s,
00084 std::streamsize num)
00085 {
00086 throw;
00087 }