Home | History | Annotate | Download | only in ada
      1 ----------------------------------------------------------------
      2 --  ZLib for Ada thick binding.                               --
      3 --                                                            --
      4 --  Copyright (C) 2002-2004 Dmitriy Anisimkov                 --
      5 --                                                            --
      6 --  Open source license information is in the zlib.ads file.  --
      7 ----------------------------------------------------------------
      8 --
      9 --  $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $
     10 
     11 --  This demo program provided by Dr Steve Sangwine <sjs (a] essex.ac.uk>
     12 --
     13 --  Demonstration of a problem with Zlib-Ada (already fixed) when a buffer
     14 --  of exactly the correct size is used for decompressed data, and the last
     15 --  few bytes passed in to Zlib are checksum bytes.
     16 
     17 --  This program compresses a string of text, and then decompresses the
     18 --  compressed text into a buffer of the same size as the original text.
     19 
     20 with Ada.Streams; use Ada.Streams;
     21 with Ada.Text_IO;
     22 
     23 with ZLib; use ZLib;
     24 
     25 procedure Buffer_Demo is
     26    EOL  : Character renames ASCII.LF;
     27    Text : constant String
     28      := "Four score and seven years ago our fathers brought forth," & EOL &
     29         "upon this continent, a new nation, conceived in liberty," & EOL &
     30         "and dedicated to the proposition that `all men are created equal'.";
     31 
     32    Source : Stream_Element_Array (1 .. Text'Length);
     33    for Source'Address use Text'Address;
     34 
     35 begin
     36    Ada.Text_IO.Put (Text);
     37    Ada.Text_IO.New_Line;
     38    Ada.Text_IO.Put_Line
     39      ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes");
     40 
     41    declare
     42       Compressed_Data : Stream_Element_Array (1 .. Text'Length);
     43       L               : Stream_Element_Offset;
     44    begin
     45       Compress : declare
     46          Compressor : Filter_Type;
     47          I : Stream_Element_Offset;
     48       begin
     49          Deflate_Init (Compressor);
     50 
     51          --  Compress the whole of T at once.
     52 
     53          Translate (Compressor, Source, I, Compressed_Data, L, Finish);
     54          pragma Assert (I = Source'Last);
     55 
     56          Close (Compressor);
     57 
     58          Ada.Text_IO.Put_Line
     59            ("Compressed size :   "
     60             & Stream_Element_Offset'Image (L) & " bytes");
     61       end Compress;
     62 
     63       --  Now we decompress the data, passing short blocks of data to Zlib
     64       --  (because this demonstrates the problem - the last block passed will
     65       --  contain checksum information and there will be no output, only a
     66       --  check inside Zlib that the checksum is correct).
     67 
     68       Decompress : declare
     69          Decompressor : Filter_Type;
     70 
     71          Uncompressed_Data : Stream_Element_Array (1 .. Text'Length);
     72 
     73          Block_Size : constant := 4;
     74          --  This makes sure that the last block contains
     75          --  only Adler checksum data.
     76 
     77          P : Stream_Element_Offset := Compressed_Data'First - 1;
     78          O : Stream_Element_Offset;
     79       begin
     80          Inflate_Init (Decompressor);
     81 
     82          loop
     83             Translate
     84               (Decompressor,
     85                Compressed_Data
     86                  (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)),
     87                P,
     88                Uncompressed_Data
     89                  (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last),
     90                O,
     91                No_Flush);
     92 
     93                Ada.Text_IO.Put_Line
     94                  ("Total in : " & Count'Image (Total_In (Decompressor)) &
     95                   ", out : " & Count'Image (Total_Out (Decompressor)));
     96 
     97                exit when P = L;
     98          end loop;
     99 
    100          Ada.Text_IO.New_Line;
    101          Ada.Text_IO.Put_Line
    102            ("Decompressed text matches original text : "
    103              & Boolean'Image (Uncompressed_Data = Source));
    104       end Decompress;
    105    end;
    106 end Buffer_Demo;
    107