33 std::ostream* decorated;
35 enum { BUFFER_SIZE = 5000 };
36 char buffer[BUFFER_SIZE];
37 bz_stream bzip_stream;
41 std::ostream* decorated_);
59 std::ostream* decorated_) :
60 decorated(decorated_) {
61 assert(decorated !=
nullptr);
64 std::memset(&bzip_stream, 0,
sizeof(bzip_stream));
65 auto info_(BZ2_bzCompressInit(&bzip_stream, 1, 0, 0 ));
66 assert(info_ == BZ_OK);
69 setp(buffer, buffer + BUFFER_SIZE);
79 unsigned int data_size_(
static_cast<unsigned int>(pptr() - buffer));
80 assert(data_size_ <= BUFFER_SIZE);
85 bzip_stream.next_in = buffer;
86 bzip_stream.avail_in = data_size_;
90 char obuffer_[BUFFER_SIZE];
93 bzip_stream.next_out = obuffer_;
94 bzip_stream.avail_out = BUFFER_SIZE;
95 info_ = BZ2_bzCompress(&bzip_stream, BZ_FINISH);
96 assert(info_ == BZ_FINISH_OK || info_ == BZ_STREAM_END);
99 decorated->write(obuffer_, BUFFER_SIZE - bzip_stream.avail_out);
101 while(info_ != BZ_STREAM_END);
104 info_ = BZ2_bzCompressEnd(&bzip_stream);
105 assert(info_ == BZ_OK);
107 info_ = BZ2_bzCompressInit(&bzip_stream, 1, 0, 0 );
108 assert(info_ == BZ_OK);
112 setp(buffer, buffer + BUFFER_SIZE);
115 int Bzip2OStream::Buffer::overflow(
117 assert(pptr() - buffer == BUFFER_SIZE);
120 char obuffer_[BUFFER_SIZE];
121 bzip_stream.next_in = buffer;
122 bzip_stream.avail_in = BUFFER_SIZE;
123 bzip_stream.next_out = obuffer_;
124 bzip_stream.avail_out = BUFFER_SIZE;
125 auto info_(BZ2_bzCompress(&bzip_stream, BZ_RUN));
126 assert(info_ == BZ_RUN_OK);
127 assert(bzip_stream.avail_in < BUFFER_SIZE);
130 decorated->write(obuffer_, BUFFER_SIZE - bzip_stream.avail_out);
133 std::memmove(buffer, bzip_stream.next_in, bzip_stream.avail_in);
136 setp(buffer, buffer + BUFFER_SIZE);
137 pbump(bzip_stream.avail_in);
140 if(c_ != traits_type::eof()) {
141 *pptr() = traits_type::to_char_type(c_);
145 return traits_type::not_eof(c_);
149 std::ostream* decorated_) :
150 buffer(new
Buffer(decorated_)) {