This is a disaster, SCons is annoying the shit out of me, I guess I am going to build...
[ail.git] / source / bzip2.cpp
blobcd65def7639b91876cfadcbfa0c6e1f912767d97
1 #include <ail/bzip2.hpp>
3 namespace ail
5 bzip2_reader::bzip2_reader():
6 bz_file(0)
10 bzip2_reader::bzip2_reader(std::string const & file_name)
12 open(file_name);
15 bzip2_reader::~bzip2_reader()
17 if(bz_file != 0)
19 int bz_error;
20 ::fclose(file);
21 ::BZ2_bzReadClose(&bz_error, bz_file);
25 bool bzip2_reader::open(std::string const & file_name)
27 int bz_error;
28 file = ::fopen(file_name.c_str(), "rb");
29 if(file == 0)
30 return false;
31 bz_file = ::BZ2_bzReadOpen(&bz_error, file, 0, 0, 0, 0);
32 if(bz_file == 0)
34 ::fclose(file);
35 ::BZ2_bzReadClose(&bz_error, bz_file);
36 return false;
38 return true;
41 bool bzip2_reader::read(std::string & buffer)
43 std::size_t const buffer_size = 16 * 1024;
44 char in_buffer[buffer_size];
45 int bz_error;
46 int bytes_read = ::BZ2_bzRead(&bz_error, bz_file, in_buffer, static_cast<int>(buffer_size));
47 if(bz_error != BZ_OK)
48 return false;
49 std::string new_data;
50 new_data.assign(in_buffer, static_cast<std::size_t>(bytes_read));
51 buffer += new_data;
52 return true;
55 bool decompress_bzip2(std::string const & file_name, std::string & output)
57 bzip2_reader reader;
58 if(!reader.open(file_name))
59 return false;
60 while(reader.read(output));
61 return true;