| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | 
							- ----------------------------------------------------------------
 
- --  ZLib for Ada thick binding.                               --
 
- --                                                            --
 
- --  Copyright (C) 2002-2004 Dmitriy Anisimkov                 --
 
- --                                                            --
 
- --  Open source license information is in the zlib.ads file.  --
 
- ----------------------------------------------------------------
 
- --
 
- --  $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $
 
- --  This demo program provided by Dr Steve Sangwine <sjs@essex.ac.uk>
 
- --
 
- --  Demonstration of a problem with Zlib-Ada (already fixed) when a buffer
 
- --  of exactly the correct size is used for decompressed data, and the last
 
- --  few bytes passed in to Zlib are checksum bytes.
 
- --  This program compresses a string of text, and then decompresses the
 
- --  compressed text into a buffer of the same size as the original text.
 
- with Ada.Streams; use Ada.Streams;
 
- with Ada.Text_IO;
 
- with ZLib; use ZLib;
 
- procedure Buffer_Demo is
 
-    EOL  : Character renames ASCII.LF;
 
-    Text : constant String
 
-      := "Four score and seven years ago our fathers brought forth," & EOL &
 
-         "upon this continent, a new nation, conceived in liberty," & EOL &
 
-         "and dedicated to the proposition that `all men are created equal'.";
 
-    Source : Stream_Element_Array (1 .. Text'Length);
 
-    for Source'Address use Text'Address;
 
- begin
 
-    Ada.Text_IO.Put (Text);
 
-    Ada.Text_IO.New_Line;
 
-    Ada.Text_IO.Put_Line
 
-      ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes");
 
-    declare
 
-       Compressed_Data : Stream_Element_Array (1 .. Text'Length);
 
-       L               : Stream_Element_Offset;
 
-    begin
 
-       Compress : declare
 
-          Compressor : Filter_Type;
 
-          I : Stream_Element_Offset;
 
-       begin
 
-          Deflate_Init (Compressor);
 
-          --  Compress the whole of T at once.
 
-          Translate (Compressor, Source, I, Compressed_Data, L, Finish);
 
-          pragma Assert (I = Source'Last);
 
-          Close (Compressor);
 
-          Ada.Text_IO.Put_Line
 
-            ("Compressed size :   "
 
-             & Stream_Element_Offset'Image (L) & " bytes");
 
-       end Compress;
 
-       --  Now we decompress the data, passing short blocks of data to Zlib
 
-       --  (because this demonstrates the problem - the last block passed will
 
-       --  contain checksum information and there will be no output, only a
 
-       --  check inside Zlib that the checksum is correct).
 
-       Decompress : declare
 
-          Decompressor : Filter_Type;
 
-          Uncompressed_Data : Stream_Element_Array (1 .. Text'Length);
 
-          Block_Size : constant := 4;
 
-          --  This makes sure that the last block contains
 
-          --  only Adler checksum data.
 
-          P : Stream_Element_Offset := Compressed_Data'First - 1;
 
-          O : Stream_Element_Offset;
 
-       begin
 
-          Inflate_Init (Decompressor);
 
-          loop
 
-             Translate
 
-               (Decompressor,
 
-                Compressed_Data
 
-                  (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)),
 
-                P,
 
-                Uncompressed_Data
 
-                  (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last),
 
-                O,
 
-                No_Flush);
 
-                Ada.Text_IO.Put_Line
 
-                  ("Total in : " & Count'Image (Total_In (Decompressor)) &
 
-                   ", out : " & Count'Image (Total_Out (Decompressor)));
 
-                exit when P = L;
 
-          end loop;
 
-          Ada.Text_IO.New_Line;
 
-          Ada.Text_IO.Put_Line
 
-            ("Decompressed text matches original text : "
 
-              & Boolean'Image (Uncompressed_Data = Source));
 
-       end Decompress;
 
-    end;
 
- end Buffer_Demo;
 
 
  |