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