Chris@4
|
1 ----------------------------------------------------------------
|
Chris@4
|
2 -- ZLib for Ada thick binding. --
|
Chris@4
|
3 -- --
|
Chris@4
|
4 -- Copyright (C) 2002-2003 Dmitriy Anisimkov --
|
Chris@4
|
5 -- --
|
Chris@4
|
6 -- Open source license information is in the zlib.ads file. --
|
Chris@4
|
7 ----------------------------------------------------------------
|
Chris@4
|
8
|
Chris@4
|
9 -- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $
|
Chris@4
|
10
|
Chris@4
|
11 -- Test/demo program for the generic read interface.
|
Chris@4
|
12
|
Chris@4
|
13 with Ada.Numerics.Discrete_Random;
|
Chris@4
|
14 with Ada.Streams;
|
Chris@4
|
15 with Ada.Text_IO;
|
Chris@4
|
16
|
Chris@4
|
17 with ZLib;
|
Chris@4
|
18
|
Chris@4
|
19 procedure Read is
|
Chris@4
|
20
|
Chris@4
|
21 use Ada.Streams;
|
Chris@4
|
22
|
Chris@4
|
23 ------------------------------------
|
Chris@4
|
24 -- Test configuration parameters --
|
Chris@4
|
25 ------------------------------------
|
Chris@4
|
26
|
Chris@4
|
27 File_Size : Stream_Element_Offset := 100_000;
|
Chris@4
|
28
|
Chris@4
|
29 Continuous : constant Boolean := False;
|
Chris@4
|
30 -- If this constant is True, the test would be repeated again and again,
|
Chris@4
|
31 -- with increment File_Size for every iteration.
|
Chris@4
|
32
|
Chris@4
|
33 Header : constant ZLib.Header_Type := ZLib.Default;
|
Chris@4
|
34 -- Do not use Header other than Default in ZLib versions 1.1.4 and older.
|
Chris@4
|
35
|
Chris@4
|
36 Init_Random : constant := 8;
|
Chris@4
|
37 -- We are using the same random sequence, in case of we catch bug,
|
Chris@4
|
38 -- so we would be able to reproduce it.
|
Chris@4
|
39
|
Chris@4
|
40 -- End --
|
Chris@4
|
41
|
Chris@4
|
42 Pack_Size : Stream_Element_Offset;
|
Chris@4
|
43 Offset : Stream_Element_Offset;
|
Chris@4
|
44
|
Chris@4
|
45 Filter : ZLib.Filter_Type;
|
Chris@4
|
46
|
Chris@4
|
47 subtype Visible_Symbols
|
Chris@4
|
48 is Stream_Element range 16#20# .. 16#7E#;
|
Chris@4
|
49
|
Chris@4
|
50 package Random_Elements is new
|
Chris@4
|
51 Ada.Numerics.Discrete_Random (Visible_Symbols);
|
Chris@4
|
52
|
Chris@4
|
53 Gen : Random_Elements.Generator;
|
Chris@4
|
54 Period : constant Stream_Element_Offset := 200;
|
Chris@4
|
55 -- Period constant variable for random generator not to be very random.
|
Chris@4
|
56 -- Bigger period, harder random.
|
Chris@4
|
57
|
Chris@4
|
58 Read_Buffer : Stream_Element_Array (1 .. 2048);
|
Chris@4
|
59 Read_First : Stream_Element_Offset;
|
Chris@4
|
60 Read_Last : Stream_Element_Offset;
|
Chris@4
|
61
|
Chris@4
|
62 procedure Reset;
|
Chris@4
|
63
|
Chris@4
|
64 procedure Read
|
Chris@4
|
65 (Item : out Stream_Element_Array;
|
Chris@4
|
66 Last : out Stream_Element_Offset);
|
Chris@4
|
67 -- this procedure is for generic instantiation of
|
Chris@4
|
68 -- ZLib.Read
|
Chris@4
|
69 -- reading data from the File_In.
|
Chris@4
|
70
|
Chris@4
|
71 procedure Read is new ZLib.Read
|
Chris@4
|
72 (Read,
|
Chris@4
|
73 Read_Buffer,
|
Chris@4
|
74 Rest_First => Read_First,
|
Chris@4
|
75 Rest_Last => Read_Last);
|
Chris@4
|
76
|
Chris@4
|
77 ----------
|
Chris@4
|
78 -- Read --
|
Chris@4
|
79 ----------
|
Chris@4
|
80
|
Chris@4
|
81 procedure Read
|
Chris@4
|
82 (Item : out Stream_Element_Array;
|
Chris@4
|
83 Last : out Stream_Element_Offset) is
|
Chris@4
|
84 begin
|
Chris@4
|
85 Last := Stream_Element_Offset'Min
|
Chris@4
|
86 (Item'Last,
|
Chris@4
|
87 Item'First + File_Size - Offset);
|
Chris@4
|
88
|
Chris@4
|
89 for J in Item'First .. Last loop
|
Chris@4
|
90 if J < Item'First + Period then
|
Chris@4
|
91 Item (J) := Random_Elements.Random (Gen);
|
Chris@4
|
92 else
|
Chris@4
|
93 Item (J) := Item (J - Period);
|
Chris@4
|
94 end if;
|
Chris@4
|
95
|
Chris@4
|
96 Offset := Offset + 1;
|
Chris@4
|
97 end loop;
|
Chris@4
|
98 end Read;
|
Chris@4
|
99
|
Chris@4
|
100 -----------
|
Chris@4
|
101 -- Reset --
|
Chris@4
|
102 -----------
|
Chris@4
|
103
|
Chris@4
|
104 procedure Reset is
|
Chris@4
|
105 begin
|
Chris@4
|
106 Random_Elements.Reset (Gen, Init_Random);
|
Chris@4
|
107 Pack_Size := 0;
|
Chris@4
|
108 Offset := 1;
|
Chris@4
|
109 Read_First := Read_Buffer'Last + 1;
|
Chris@4
|
110 Read_Last := Read_Buffer'Last;
|
Chris@4
|
111 end Reset;
|
Chris@4
|
112
|
Chris@4
|
113 begin
|
Chris@4
|
114 Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
|
Chris@4
|
115
|
Chris@4
|
116 loop
|
Chris@4
|
117 for Level in ZLib.Compression_Level'Range loop
|
Chris@4
|
118
|
Chris@4
|
119 Ada.Text_IO.Put ("Level ="
|
Chris@4
|
120 & ZLib.Compression_Level'Image (Level));
|
Chris@4
|
121
|
Chris@4
|
122 -- Deflate using generic instantiation.
|
Chris@4
|
123
|
Chris@4
|
124 ZLib.Deflate_Init
|
Chris@4
|
125 (Filter,
|
Chris@4
|
126 Level,
|
Chris@4
|
127 Header => Header);
|
Chris@4
|
128
|
Chris@4
|
129 Reset;
|
Chris@4
|
130
|
Chris@4
|
131 Ada.Text_IO.Put
|
Chris@4
|
132 (Stream_Element_Offset'Image (File_Size) & " ->");
|
Chris@4
|
133
|
Chris@4
|
134 loop
|
Chris@4
|
135 declare
|
Chris@4
|
136 Buffer : Stream_Element_Array (1 .. 1024);
|
Chris@4
|
137 Last : Stream_Element_Offset;
|
Chris@4
|
138 begin
|
Chris@4
|
139 Read (Filter, Buffer, Last);
|
Chris@4
|
140
|
Chris@4
|
141 Pack_Size := Pack_Size + Last - Buffer'First + 1;
|
Chris@4
|
142
|
Chris@4
|
143 exit when Last < Buffer'Last;
|
Chris@4
|
144 end;
|
Chris@4
|
145 end loop;
|
Chris@4
|
146
|
Chris@4
|
147 Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size));
|
Chris@4
|
148
|
Chris@4
|
149 ZLib.Close (Filter);
|
Chris@4
|
150 end loop;
|
Chris@4
|
151
|
Chris@4
|
152 exit when not Continuous;
|
Chris@4
|
153
|
Chris@4
|
154 File_Size := File_Size + 1;
|
Chris@4
|
155 end loop;
|
Chris@4
|
156 end Read;
|