1 #ifndef OSMIUM_IO_BZIP2_COMPRESSION_HPP
2 #define OSMIUM_IO_BZIP2_COMPRESSION_HPP
74 std::runtime_error(what),
75 bzip2_error_code(error_code),
76 system_errno(error_code == BZ_IO_ERROR ? errno : 0) {
85 OSMIUM_NORETURN inline void throw_bzip2_error(BZFILE* bzfile,
const char* msg,
int bzlib_error = 0) {
86 std::string error(
"bzip2 error: ");
89 int errnum = bzlib_error;
91 error += std::to_string(bzlib_error);
93 error += ::BZ2_bzerror(bzfile, &errnum);
110 m_file(fdopen(dup(fd),
"wb")),
112 m_bzfile(::BZ2_bzWriteOpen(&m_bzerror, m_file, 6, 0, 0)) {
114 detail::throw_bzip2_error(m_bzfile,
"write open failed", m_bzerror);
122 void write(
const std::string& data)
override final {
124 ::BZ2_bzWrite(&error, m_bzfile, const_cast<char*>(data.data()), static_cast_with_assert<int>(data.size()));
125 if (error != BZ_OK && error != BZ_STREAM_END) {
126 detail::throw_bzip2_error(m_bzfile,
"write failed", error);
133 ::BZ2_bzWriteClose(&error, m_bzfile, 0,
nullptr,
nullptr);
138 if (error != BZ_OK) {
139 detail::throw_bzip2_error(m_bzfile,
"write close failed", error);
157 m_file(fdopen(dup(fd),
"rb")),
159 m_bzfile(::BZ2_bzReadOpen(&m_bzerror, m_file, 0, 0, nullptr, 0)) {
161 detail::throw_bzip2_error(m_bzfile,
"read open failed", m_bzerror);
169 std::string
read() override final {
175 int nread = ::BZ2_bzRead(&error, m_bzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<int>(buffer.size()));
176 if (error != BZ_OK && error != BZ_STREAM_END) {
177 detail::throw_bzip2_error(m_bzfile,
"read failed", error);
179 if (error == BZ_STREAM_END) {
182 if (! feof(m_file)) {
183 ::BZ2_bzReadGetUnused(&error, m_bzfile, &unused, &nunused);
184 if (error != BZ_OK) {
185 detail::throw_bzip2_error(m_bzfile,
"get unused failed", error);
187 std::string unused_data(static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused));
188 ::BZ2_bzReadClose(&error, m_bzfile);
189 if (error != BZ_OK) {
190 detail::throw_bzip2_error(m_bzfile,
"read close failed", error);
192 m_bzfile = ::BZ2_bzReadOpen(&error, m_file, 0, 0, const_cast<void*>(static_cast<const void*>(unused_data.data())), static_cast_with_assert<int>(unused_data.size()));
193 if (error != BZ_OK) {
194 detail::throw_bzip2_error(m_bzfile,
"read open failed", error);
200 buffer.resize(static_cast<std::string::size_type>(nread));
209 ::BZ2_bzReadClose(&error, m_bzfile);
214 if (error != BZ_OK) {
215 detail::throw_bzip2_error(m_bzfile,
"read close failed", error);
234 m_bzstream.next_in =
const_cast<char*
>(buffer);
235 m_bzstream.avail_in = static_cast_with_assert<unsigned int>(size);
236 int result = BZ2_bzDecompressInit(&m_bzstream, 0, 0);
237 if (result != BZ_OK) {
238 std::string message(
"bzip2 error: decompression init failed: ");
244 BZ2_bzDecompressEnd(&m_bzstream);
247 std::string
read() override final {
251 const size_t buffer_size = 10240;
252 output.resize(buffer_size);
253 m_bzstream.next_out =
const_cast<char*
>(output.data());
254 m_bzstream.avail_out = buffer_size;
255 int result = BZ2_bzDecompress(&m_bzstream);
257 if (result != BZ_OK) {
262 if (result != BZ_OK && result != BZ_STREAM_END) {
263 std::string message(
"bzip2 error: decompress failed: ");
267 output.resize(static_cast<unsigned long>(m_bzstream.next_out - output.data()));
289 #endif // OSMIUM_IO_BZIP2_COMPRESSION_HPP
bz_stream m_bzstream
Definition: bzip2_compression.hpp:226
Definition: bzip2_compression.hpp:146
Bzip2Compressor(int fd)
Definition: bzip2_compression.hpp:108
int bzip2_error_code
Definition: bzip2_compression.hpp:70
#define OSMIUM_NORETURN
Definition: compatibility.hpp:44
int m_bzerror
Definition: bzip2_compression.hpp:149
const char * m_buffer
Definition: bzip2_compression.hpp:224
int m_bzerror
Definition: bzip2_compression.hpp:103
size_t m_buffer_size
Definition: bzip2_compression.hpp:225
bool m_stream_end
Definition: bzip2_compression.hpp:151
static CompressionFactory & instance()
Definition: compression.hpp:136
static constexpr unsigned int input_buffer_size
Definition: compression.hpp:78
Definition: reader_iterator.hpp:39
bzip2_error(const std::string &what, int error_code)
Definition: bzip2_compression.hpp:73
Definition: bzip2_compression.hpp:100
int system_errno
Definition: bzip2_compression.hpp:71
Definition: compression.hpp:74
void close() overridefinal
Definition: bzip2_compression.hpp:206
FILE * m_file
Definition: bzip2_compression.hpp:102
Definition: bzip2_compression.hpp:222
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
Bzip2BufferDecompressor(const char *buffer, size_t size)
Definition: bzip2_compression.hpp:230
~Bzip2Decompressor() overridefinal
Definition: bzip2_compression.hpp:165
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:150
BZFILE * m_bzfile
Definition: bzip2_compression.hpp:104
std::string read() overridefinal
Definition: bzip2_compression.hpp:169
~Bzip2BufferDecompressor() overridefinal
Definition: bzip2_compression.hpp:243
void close() overridefinal
Definition: bzip2_compression.hpp:130
Definition: compression.hpp:59
FILE * m_file
Definition: bzip2_compression.hpp:148
bool register_compression(osmium::io::file_compression compression, create_compressor_type create_compressor, create_decompressor_type_fd create_decompressor_fd, create_decompressor_type_buffer create_decompressor_buffer)
Definition: compression.hpp:141
std::string read() overridefinal
Definition: bzip2_compression.hpp:247
Bzip2Decompressor(int fd)
Definition: bzip2_compression.hpp:155
~Bzip2Compressor() overridefinal
Definition: bzip2_compression.hpp:118
Definition: bzip2_compression.hpp:68
void write(const std::string &data) overridefinal
Definition: bzip2_compression.hpp:122