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