| ---------------------------------------------------------------- |
| -- 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; |