1275793eaSopenharmony_ci---------------------------------------------------------------- 2275793eaSopenharmony_ci-- ZLib for Ada thick binding. -- 3275793eaSopenharmony_ci-- -- 4275793eaSopenharmony_ci-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- 5275793eaSopenharmony_ci-- -- 6275793eaSopenharmony_ci-- Open source license information is in the zlib.ads file. -- 7275793eaSopenharmony_ci---------------------------------------------------------------- 8275793eaSopenharmony_ci-- 9275793eaSopenharmony_ci-- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $ 10275793eaSopenharmony_ci 11275793eaSopenharmony_ci-- This demo program provided by Dr Steve Sangwine <sjs@essex.ac.uk> 12275793eaSopenharmony_ci-- 13275793eaSopenharmony_ci-- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer 14275793eaSopenharmony_ci-- of exactly the correct size is used for decompressed data, and the last 15275793eaSopenharmony_ci-- few bytes passed in to Zlib are checksum bytes. 16275793eaSopenharmony_ci 17275793eaSopenharmony_ci-- This program compresses a string of text, and then decompresses the 18275793eaSopenharmony_ci-- compressed text into a buffer of the same size as the original text. 19275793eaSopenharmony_ci 20275793eaSopenharmony_ciwith Ada.Streams; use Ada.Streams; 21275793eaSopenharmony_ciwith Ada.Text_IO; 22275793eaSopenharmony_ci 23275793eaSopenharmony_ciwith ZLib; use ZLib; 24275793eaSopenharmony_ci 25275793eaSopenharmony_ciprocedure Buffer_Demo is 26275793eaSopenharmony_ci EOL : Character renames ASCII.LF; 27275793eaSopenharmony_ci Text : constant String 28275793eaSopenharmony_ci := "Four score and seven years ago our fathers brought forth," & EOL & 29275793eaSopenharmony_ci "upon this continent, a new nation, conceived in liberty," & EOL & 30275793eaSopenharmony_ci "and dedicated to the proposition that `all men are created equal'."; 31275793eaSopenharmony_ci 32275793eaSopenharmony_ci Source : Stream_Element_Array (1 .. Text'Length); 33275793eaSopenharmony_ci for Source'Address use Text'Address; 34275793eaSopenharmony_ci 35275793eaSopenharmony_cibegin 36275793eaSopenharmony_ci Ada.Text_IO.Put (Text); 37275793eaSopenharmony_ci Ada.Text_IO.New_Line; 38275793eaSopenharmony_ci Ada.Text_IO.Put_Line 39275793eaSopenharmony_ci ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes"); 40275793eaSopenharmony_ci 41275793eaSopenharmony_ci declare 42275793eaSopenharmony_ci Compressed_Data : Stream_Element_Array (1 .. Text'Length); 43275793eaSopenharmony_ci L : Stream_Element_Offset; 44275793eaSopenharmony_ci begin 45275793eaSopenharmony_ci Compress : declare 46275793eaSopenharmony_ci Compressor : Filter_Type; 47275793eaSopenharmony_ci I : Stream_Element_Offset; 48275793eaSopenharmony_ci begin 49275793eaSopenharmony_ci Deflate_Init (Compressor); 50275793eaSopenharmony_ci 51275793eaSopenharmony_ci -- Compress the whole of T at once. 52275793eaSopenharmony_ci 53275793eaSopenharmony_ci Translate (Compressor, Source, I, Compressed_Data, L, Finish); 54275793eaSopenharmony_ci pragma Assert (I = Source'Last); 55275793eaSopenharmony_ci 56275793eaSopenharmony_ci Close (Compressor); 57275793eaSopenharmony_ci 58275793eaSopenharmony_ci Ada.Text_IO.Put_Line 59275793eaSopenharmony_ci ("Compressed size : " 60275793eaSopenharmony_ci & Stream_Element_Offset'Image (L) & " bytes"); 61275793eaSopenharmony_ci end Compress; 62275793eaSopenharmony_ci 63275793eaSopenharmony_ci -- Now we decompress the data, passing short blocks of data to Zlib 64275793eaSopenharmony_ci -- (because this demonstrates the problem - the last block passed will 65275793eaSopenharmony_ci -- contain checksum information and there will be no output, only a 66275793eaSopenharmony_ci -- check inside Zlib that the checksum is correct). 67275793eaSopenharmony_ci 68275793eaSopenharmony_ci Decompress : declare 69275793eaSopenharmony_ci Decompressor : Filter_Type; 70275793eaSopenharmony_ci 71275793eaSopenharmony_ci Uncompressed_Data : Stream_Element_Array (1 .. Text'Length); 72275793eaSopenharmony_ci 73275793eaSopenharmony_ci Block_Size : constant := 4; 74275793eaSopenharmony_ci -- This makes sure that the last block contains 75275793eaSopenharmony_ci -- only Adler checksum data. 76275793eaSopenharmony_ci 77275793eaSopenharmony_ci P : Stream_Element_Offset := Compressed_Data'First - 1; 78275793eaSopenharmony_ci O : Stream_Element_Offset; 79275793eaSopenharmony_ci begin 80275793eaSopenharmony_ci Inflate_Init (Decompressor); 81275793eaSopenharmony_ci 82275793eaSopenharmony_ci loop 83275793eaSopenharmony_ci Translate 84275793eaSopenharmony_ci (Decompressor, 85275793eaSopenharmony_ci Compressed_Data 86275793eaSopenharmony_ci (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)), 87275793eaSopenharmony_ci P, 88275793eaSopenharmony_ci Uncompressed_Data 89275793eaSopenharmony_ci (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last), 90275793eaSopenharmony_ci O, 91275793eaSopenharmony_ci No_Flush); 92275793eaSopenharmony_ci 93275793eaSopenharmony_ci Ada.Text_IO.Put_Line 94275793eaSopenharmony_ci ("Total in : " & Count'Image (Total_In (Decompressor)) & 95275793eaSopenharmony_ci ", out : " & Count'Image (Total_Out (Decompressor))); 96275793eaSopenharmony_ci 97275793eaSopenharmony_ci exit when P = L; 98275793eaSopenharmony_ci end loop; 99275793eaSopenharmony_ci 100275793eaSopenharmony_ci Ada.Text_IO.New_Line; 101275793eaSopenharmony_ci Ada.Text_IO.Put_Line 102275793eaSopenharmony_ci ("Decompressed text matches original text : " 103275793eaSopenharmony_ci & Boolean'Image (Uncompressed_Data = Source)); 104275793eaSopenharmony_ci end Decompress; 105275793eaSopenharmony_ci end; 106275793eaSopenharmony_ciend Buffer_Demo; 107