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