17#include "bzip2_streambuf.h"
19util::bzip2_streambuf::bzip2_streambuf(
const std::string& path)
20: file_(fopen(path.c_str(),
"rb"))
23 throw std::runtime_error(
"fopen failed");
25 bz_ = BZ2_bzReadOpen(&bzerror_, file_, 0, 0,
nullptr, 0);
27 throw std::runtime_error(
"BZ2_bzReadOpen failed");
29 setg(buffer_.data(), buffer_.data(), buffer_.data());
32util::bzip2_streambuf::~bzip2_streambuf() {
34 BZ2_bzReadClose(&bzerror_, bz_);
40auto util::bzip2_streambuf::underflow() -> int_type {
41 int n = BZ2_bzRead(&bzerror_, bz_, buffer_.data(), buffer_.size());
42 if(bzerror_ != BZ_OK && bzerror_ != BZ_STREAM_END)
43 return traits_type::eof();
46 return traits_type::eof();
48 setg(buffer_.data(), buffer_.data(), buffer_.data() + n);
49 return traits_type::to_int_type(*gptr());