1 ----------------------------------------------------------------
   2 --  ZLib for Ada thick binding.                               --
   3 --                                                            --
   4 --  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
   5 --                                                            --
   6 --  Open source license information is in the zlib.ads file.  --
   7 ----------------------------------------------------------------
   8 
   9 --  $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $
  10 
  11 --  Test/demo program for the generic read interface.
  12 
  13 with Ada.Numerics.Discrete_Random;
  14 with Ada.Streams;
  15 with Ada.Text_IO;
  16 
  17 with ZLib;
  18 
  19 procedure Read is
  20 
  21    use Ada.Streams;
  22 
  23    ------------------------------------
  24    --  Test configuration parameters --
  25    ------------------------------------
  26 
  27    File_Size   : Stream_Element_Offset := 100_000;
  28 
  29    Continuous  : constant Boolean          := False;
  30    --  If this constant is True, the test would be repeated again and again,
  31    --  with increment File_Size for every iteration.
  32 
  33    Header      : constant ZLib.Header_Type := ZLib.Default;
  34    --  Do not use Header other than Default in ZLib versions 1.1.4 and older.
  35 
  36    Init_Random : constant := 8;
  37    --  We are using the same random sequence, in case of we catch bug,
  38    --  so we would be able to reproduce it.
  39 
  40    -- End --
  41 
  42    Pack_Size : Stream_Element_Offset;
  43    Offset    : Stream_Element_Offset;
  44 
  45    Filter     : ZLib.Filter_Type;
  46 
  47    subtype Visible_Symbols
  48       is Stream_Element range 16#20# .. 16#7E#;
  49 
  50    package Random_Elements is new
  51       Ada.Numerics.Discrete_Random (Visible_Symbols);
  52 
  53    Gen : Random_Elements.Generator;
  54    Period  : constant Stream_Element_Offset := 200;
  55    --  Period constant variable for random generator not to be very random.
  56    --  Bigger period, harder random.
  57 
  58    Read_Buffer : Stream_Element_Array (1 .. 2048);
  59    Read_First  : Stream_Element_Offset;
  60    Read_Last   : Stream_Element_Offset;
  61 
  62    procedure Reset;
  63 
  64    procedure Read
  65      (Item : out Stream_Element_Array;
  66       Last : out Stream_Element_Offset);
  67    --  this procedure is for generic instantiation of
  68    --  ZLib.Read
  69    --  reading data from the File_In.
  70 
  71    procedure Read is new ZLib.Read
  72                            (Read,
  73                             Read_Buffer,
  74                             Rest_First => Read_First,
  75                             Rest_Last  => Read_Last);
  76 
  77    ----------
  78    -- Read --
  79    ----------
  80 
  81    procedure Read
  82      (Item : out Stream_Element_Array;
  83       Last : out Stream_Element_Offset) is
  84    begin
  85       Last := Stream_Element_Offset'Min
  86                (Item'Last,
  87                 Item'First + File_Size - Offset);
  88 
  89       for J in Item'First .. Last loop
  90          if J < Item'First + Period then
  91             Item (J) := Random_Elements.Random (Gen);
  92          else
  93             Item (J) := Item (J - Period);
  94          end if;
  95 
  96          Offset   := Offset + 1;
  97       end loop;
  98    end Read;
  99 
 100    -----------
 101    -- Reset --
 102    -----------
 103 
 104    procedure Reset is
 105    begin
 106       Random_Elements.Reset (Gen, Init_Random);
 107       Pack_Size := 0;
 108       Offset := 1;
 109       Read_First := Read_Buffer'Last + 1;
 110       Read_Last  := Read_Buffer'Last;
 111    end Reset;
 112 
 113 begin
 114    Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
 115 
 116    loop
 117       for Level in ZLib.Compression_Level'Range loop
 118 
 119          Ada.Text_IO.Put ("Level ="
 120             & ZLib.Compression_Level'Image (Level));
 121 
 122          --  Deflate using generic instantiation.
 123 
 124          ZLib.Deflate_Init
 125                (Filter,
 126                 Level,
 127                 Header => Header);
 128 
 129          Reset;
 130 
 131          Ada.Text_IO.Put
 132            (Stream_Element_Offset'Image (File_Size) & " ->");
 133 
 134          loop
 135             declare
 136                Buffer : Stream_Element_Array (1 .. 1024);
 137                Last   : Stream_Element_Offset;
 138             begin
 139                Read (Filter, Buffer, Last);
 140 
 141                Pack_Size := Pack_Size + Last - Buffer'First + 1;
 142 
 143                exit when Last < Buffer'Last;
 144             end;
 145          end loop;
 146 
 147          Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size));
 148 
 149          ZLib.Close (Filter);
 150       end loop;
 151 
 152       exit when not Continuous;
 153 
 154       File_Size := File_Size + 1;
 155    end loop;
 156 end Read;