source: Vago/zlib-1.2.8/contrib/ada/buffer_demo.adb@ 1076

Last change on this file since 1076 was 1049, checked in by s10k, 8 years ago
File size: 3.6 KB
Line 
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;
Note: See TracBrowser for help on using the repository browser.