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 20with Ada.Streams; use Ada.Streams; 21with Ada.Text_IO; 22 23with ZLib; use ZLib; 24 25procedure 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 35begin 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; 106end Buffer_Demo; 107