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