11 #if defined(HAVE_BZLIB_H) && defined(HAVE_LIBBZ2) 13 #include <Atlas/Filters/Bzip2.h> 17 #define ASSERT(exp) assert(exp) 23 const int WORKFACTOR = 30;
27 incoming.next_in =
nullptr;
28 incoming.avail_in = 0;
29 incoming.bzalloc =
nullptr;
30 incoming.bzfree =
nullptr;
31 incoming.opaque =
nullptr;
33 outgoing.bzalloc =
nullptr;
34 outgoing.bzfree =
nullptr;
35 outgoing.opaque =
nullptr;
37 BZ2_bzCompressInit(&outgoing, BS100K, 0, WORKFACTOR);
38 BZ2_bzDecompressInit(&incoming, 0, 0);
43 BZ2_bzCompressEnd(&outgoing);
44 BZ2_bzDecompressEnd(&incoming);
47 std::string Bzip2::encode(
const std::string& data)
49 std::string out_string;
54 outgoing.next_in =
const_cast<char*
>(data.data());
55 outgoing.avail_in = data.size();
59 outgoing.next_out = buf;
60 outgoing.avail_out =
sizeof(buf);
62 status = BZ2_bzCompress(&outgoing, BZ_FLUSH);
64 ASSERT(status != BZ_SEQUENCE_ERROR);
66 if (status != BZ_SEQUENCE_ERROR) {
67 out_string.append((
char*)buf,
sizeof(buf) - outgoing.avail_out);
70 }
while (outgoing.avail_out == 0);
75 std::string Bzip2::decode(
const std::string& data)
77 std::string out_string;
81 incoming.next_in =
const_cast<char*
>(data.data());
82 incoming.avail_in = data.size();
86 incoming.next_out = buf;
87 incoming.avail_out =
sizeof(buf);
89 int status = BZ2_bzDecompress(&incoming);
91 ASSERT(status == BZ_OK);
93 if (status != BZ_SEQUENCE_ERROR) {
94 out_string.append((
char*)buf,
sizeof(buf) - incoming.avail_out);
97 }
while(incoming.avail_out == 0);
102 #endif // HAVE_BZLIB_H && HAVE_LIBBZ2