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