You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.6 KiB
106 lines
3.6 KiB
---------------------------------------------------------------- |
|
-- 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;
|
|
|