Back to... Zip-Ada

Source file : bunzip.adb


-- Standalone BZip2 decoder (for .bz2 files)

with BZip2_Decoding;

with Ada.Text_IO;                       use Ada.Text_IO;
with Ada.Streams.Stream_IO;             use Ada.Streams.Stream_IO;
with Ada.Command_Line;                  use Ada.Command_Line;
with Interfaces;                        use Interfaces;

procedure bunzip is

  f_in, f_out: Ada.Streams.Stream_IO.File_Type;

  type Buffer is array(Natural range <>) of Unsigned_8;

  -- Code with SE_Buffer below:
  -- workaround for the severe xxx'Read xxx'Write performance
  -- problems in the GNAT and ObjectAda compilers (as in 2009)
  -- This possible if and only if Byte = Stream_Element and
  -- arrays types are both packed.

  procedure Read( b: out Buffer ) is
    use Ada.Streams;
    Last: Stream_Element_Offset;
    SE_Buffer : Stream_Element_Array (1..b'Length);
    for SE_Buffer'Address use b'Address;
    pragma Import (Ada, SE_Buffer);
  begin
    --  Buffer'Read(Stream(f_in), b);
    --exception
    --  when Ada.Streams.Stream_IO.End_Error =>
    --    null;
    --    -- Nothing bad, just some garbage in the buffer
    --    -- after end of compressed code
    --
    Read(Stream(f_in).all, SE_Buffer, Last);
  end Read;

  procedure Write( b: in Buffer ) is
    use Ada.Streams;
    SE_Buffer : Stream_Element_Array (1..b'Length);
    for SE_Buffer'Address use b'Address;
    pragma Import (Ada, SE_Buffer);
  begin
    --
    -- Buffer'Write(Stream(f_out), b);
    --
    -- ^ Using this, instead of the lines below, more than doubles
    -- the whole run time (incl. decompression and slow reading!) on GNAT 2008
    -- and makes +60% more time on ObjectAda 7.2.2
    --
    Write(Stream(f_out).all, SE_Buffer);
  end Write;

  package My_BZip2 is new BZip2_Decoding
  (
    input_buffer_size  => 1024,
    output_buffer_size => 4096,
    Buffer             => Buffer,
    check_CRC          => True,
    Read               => Read,
    Write              => Write
  );

begin
  if Argument_Count = 0 then
    Put_Line("Usage: bunzip <file>");
    New_Line;
    Put_Line("Decompresses a bzip2 compressed file (.bz2)");
  else
    Open(f_in, In_File, Argument(1));
    Create(f_out,Out_File, "bunzip.out");
    My_BZip2.Decompress;
    Close(f_out);
  end if;
end bunzip;

Zip-Ada: Ada library for zip archive files (.zip). Ada programming.
Some news about Zip-Ada and other related Ada projects on Gautier's blog.