You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.1 KiB
156 lines
4.1 KiB
---------------------------------------------------------------- |
|
-- ZLib for Ada thick binding. -- |
|
-- -- |
|
-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- |
|
-- -- |
|
-- Open source license information is in the zlib.ads file. -- |
|
---------------------------------------------------------------- |
|
|
|
-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $ |
|
|
|
-- Test/demo program for the generic read interface. |
|
|
|
with Ada.Numerics.Discrete_Random; |
|
with Ada.Streams; |
|
with Ada.Text_IO; |
|
|
|
with ZLib; |
|
|
|
procedure Read is |
|
|
|
use Ada.Streams; |
|
|
|
------------------------------------ |
|
-- Test configuration parameters -- |
|
------------------------------------ |
|
|
|
File_Size : Stream_Element_Offset := 100_000; |
|
|
|
Continuous : constant Boolean := False; |
|
-- If this constant is True, the test would be repeated again and again, |
|
-- with increment File_Size for every iteration. |
|
|
|
Header : constant ZLib.Header_Type := ZLib.Default; |
|
-- Do not use Header other than Default in ZLib versions 1.1.4 and older. |
|
|
|
Init_Random : constant := 8; |
|
-- We are using the same random sequence, in case of we catch bug, |
|
-- so we would be able to reproduce it. |
|
|
|
-- End -- |
|
|
|
Pack_Size : Stream_Element_Offset; |
|
Offset : Stream_Element_Offset; |
|
|
|
Filter : ZLib.Filter_Type; |
|
|
|
subtype Visible_Symbols |
|
is Stream_Element range 16#20# .. 16#7E#; |
|
|
|
package Random_Elements is new |
|
Ada.Numerics.Discrete_Random (Visible_Symbols); |
|
|
|
Gen : Random_Elements.Generator; |
|
Period : constant Stream_Element_Offset := 200; |
|
-- Period constant variable for random generator not to be very random. |
|
-- Bigger period, harder random. |
|
|
|
Read_Buffer : Stream_Element_Array (1 .. 2048); |
|
Read_First : Stream_Element_Offset; |
|
Read_Last : Stream_Element_Offset; |
|
|
|
procedure Reset; |
|
|
|
procedure Read |
|
(Item : out Stream_Element_Array; |
|
Last : out Stream_Element_Offset); |
|
-- this procedure is for generic instantiation of |
|
-- ZLib.Read |
|
-- reading data from the File_In. |
|
|
|
procedure Read is new ZLib.Read |
|
(Read, |
|
Read_Buffer, |
|
Rest_First => Read_First, |
|
Rest_Last => Read_Last); |
|
|
|
---------- |
|
-- Read -- |
|
---------- |
|
|
|
procedure Read |
|
(Item : out Stream_Element_Array; |
|
Last : out Stream_Element_Offset) is |
|
begin |
|
Last := Stream_Element_Offset'Min |
|
(Item'Last, |
|
Item'First + File_Size - Offset); |
|
|
|
for J in Item'First .. Last loop |
|
if J < Item'First + Period then |
|
Item (J) := Random_Elements.Random (Gen); |
|
else |
|
Item (J) := Item (J - Period); |
|
end if; |
|
|
|
Offset := Offset + 1; |
|
end loop; |
|
end Read; |
|
|
|
----------- |
|
-- Reset -- |
|
----------- |
|
|
|
procedure Reset is |
|
begin |
|
Random_Elements.Reset (Gen, Init_Random); |
|
Pack_Size := 0; |
|
Offset := 1; |
|
Read_First := Read_Buffer'Last + 1; |
|
Read_Last := Read_Buffer'Last; |
|
end Reset; |
|
|
|
begin |
|
Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); |
|
|
|
loop |
|
for Level in ZLib.Compression_Level'Range loop |
|
|
|
Ada.Text_IO.Put ("Level =" |
|
& ZLib.Compression_Level'Image (Level)); |
|
|
|
-- Deflate using generic instantiation. |
|
|
|
ZLib.Deflate_Init |
|
(Filter, |
|
Level, |
|
Header => Header); |
|
|
|
Reset; |
|
|
|
Ada.Text_IO.Put |
|
(Stream_Element_Offset'Image (File_Size) & " ->"); |
|
|
|
loop |
|
declare |
|
Buffer : Stream_Element_Array (1 .. 1024); |
|
Last : Stream_Element_Offset; |
|
begin |
|
Read (Filter, Buffer, Last); |
|
|
|
Pack_Size := Pack_Size + Last - Buffer'First + 1; |
|
|
|
exit when Last < Buffer'Last; |
|
end; |
|
end loop; |
|
|
|
Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size)); |
|
|
|
ZLib.Close (Filter); |
|
end loop; |
|
|
|
exit when not Continuous; |
|
|
|
File_Size := File_Size + 1; |
|
end loop; |
|
end Read;
|
|
|