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