123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463 |
- ----------------------------------------------------------------
- -- ZLib for Ada thick binding. --
- -- --
- -- Copyright (C) 2002-2003 Dmitriy Anisimkov --
- -- --
- -- Open source license information is in the zlib.ads file. --
- ----------------------------------------------------------------
- -- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $
- -- The program has a few aims.
- -- 1. Test ZLib.Ada95 thick binding functionality.
- -- 2. Show the example of use main functionality of the ZLib.Ada95 binding.
- -- 3. Build this program automatically compile all ZLib.Ada95 packages under
- -- GNAT Ada95 compiler.
- with ZLib.Streams;
- with Ada.Streams.Stream_IO;
- with Ada.Numerics.Discrete_Random;
- with Ada.Text_IO;
- with Ada.Calendar;
- procedure Test is
- use Ada.Streams;
- use Stream_IO;
- ------------------------------------
- -- Test configuration parameters --
- ------------------------------------
- File_Size : Count := 100_000;
- Continuous : constant Boolean := False;
- Header : constant ZLib.Header_Type := ZLib.Default;
- -- ZLib.None;
- -- ZLib.Auto;
- -- ZLib.GZip;
- -- Do not use Header other then Default in ZLib versions 1.1.4
- -- and older.
- Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy;
- Init_Random : constant := 10;
- -- End --
- In_File_Name : constant String := "testzlib.in";
- -- Name of the input file
- Z_File_Name : constant String := "testzlib.zlb";
- -- Name of the compressed file.
- Out_File_Name : constant String := "testzlib.out";
- -- Name of the decompressed file.
- File_In : File_Type;
- File_Out : File_Type;
- File_Back : File_Type;
- File_Z : ZLib.Streams.Stream_Type;
- Filter : ZLib.Filter_Type;
- Time_Stamp : Ada.Calendar.Time;
- procedure Generate_File;
- -- Generate file of spetsified size with some random data.
- -- The random data is repeatable, for the good compression.
- procedure Compare_Streams
- (Left, Right : in out Root_Stream_Type'Class);
- -- The procedure compearing data in 2 streams.
- -- It is for compare data before and after compression/decompression.
- procedure Compare_Files (Left, Right : String);
- -- Compare files. Based on the Compare_Streams.
- procedure Copy_Streams
- (Source, Target : in out Root_Stream_Type'Class;
- Buffer_Size : in Stream_Element_Offset := 1024);
- -- Copying data from one stream to another. It is for test stream
- -- interface of the library.
- procedure Data_In
- (Item : out Stream_Element_Array;
- Last : out Stream_Element_Offset);
- -- this procedure is for generic instantiation of
- -- ZLib.Generic_Translate.
- -- reading data from the File_In.
- procedure Data_Out (Item : in Stream_Element_Array);
- -- this procedure is for generic instantiation of
- -- ZLib.Generic_Translate.
- -- writing data to the File_Out.
- procedure Stamp;
- -- Store the timestamp to the local variable.
- procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count);
- -- Print the time statistic with the message.
- procedure Translate is new ZLib.Generic_Translate
- (Data_In => Data_In,
- Data_Out => Data_Out);
- -- This procedure is moving data from File_In to File_Out
- -- with compression or decompression, depend on initialization of
- -- Filter parameter.
- -------------------
- -- Compare_Files --
- -------------------
- procedure Compare_Files (Left, Right : String) is
- Left_File, Right_File : File_Type;
- begin
- Open (Left_File, In_File, Left);
- Open (Right_File, In_File, Right);
- Compare_Streams (Stream (Left_File).all, Stream (Right_File).all);
- Close (Left_File);
- Close (Right_File);
- end Compare_Files;
- ---------------------
- -- Compare_Streams --
- ---------------------
- procedure Compare_Streams
- (Left, Right : in out Ada.Streams.Root_Stream_Type'Class)
- is
- Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#);
- Left_Last, Right_Last : Stream_Element_Offset;
- begin
- loop
- Read (Left, Left_Buffer, Left_Last);
- Read (Right, Right_Buffer, Right_Last);
- if Left_Last /= Right_Last then
- Ada.Text_IO.Put_Line ("Compare error :"
- & Stream_Element_Offset'Image (Left_Last)
- & " /= "
- & Stream_Element_Offset'Image (Right_Last));
- raise Constraint_Error;
- elsif Left_Buffer (0 .. Left_Last)
- /= Right_Buffer (0 .. Right_Last)
- then
- Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal.");
- raise Constraint_Error;
- end if;
- exit when Left_Last < Left_Buffer'Last;
- end loop;
- end Compare_Streams;
- ------------------
- -- Copy_Streams --
- ------------------
- procedure Copy_Streams
- (Source, Target : in out Ada.Streams.Root_Stream_Type'Class;
- Buffer_Size : in Stream_Element_Offset := 1024)
- is
- Buffer : Stream_Element_Array (1 .. Buffer_Size);
- Last : Stream_Element_Offset;
- begin
- loop
- Read (Source, Buffer, Last);
- Write (Target, Buffer (1 .. Last));
- exit when Last < Buffer'Last;
- end loop;
- end Copy_Streams;
- -------------
- -- Data_In --
- -------------
- procedure Data_In
- (Item : out Stream_Element_Array;
- Last : out Stream_Element_Offset) is
- begin
- Read (File_In, Item, Last);
- end Data_In;
- --------------
- -- Data_Out --
- --------------
- procedure Data_Out (Item : in Stream_Element_Array) is
- begin
- Write (File_Out, Item);
- end Data_Out;
- -------------------
- -- Generate_File --
- -------------------
- procedure Generate_File is
- 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;
- Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10;
- Buffer_Count : constant Count := File_Size / Buffer'Length;
- -- Number of same buffers in the packet.
- Density : constant Count := 30; -- from 0 to Buffer'Length - 2;
- procedure Fill_Buffer (J, D : in Count);
- -- Change the part of the buffer.
- -----------------
- -- Fill_Buffer --
- -----------------
- procedure Fill_Buffer (J, D : in Count) is
- begin
- for K in 0 .. D loop
- Buffer
- (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1))
- := Random_Elements.Random (Gen);
- end loop;
- end Fill_Buffer;
- begin
- Random_Elements.Reset (Gen, Init_Random);
- Create (File_In, Out_File, In_File_Name);
- Fill_Buffer (1, Buffer'Length - 2);
- for J in 1 .. Buffer_Count loop
- Write (File_In, Buffer);
- Fill_Buffer (J, Density);
- end loop;
- -- fill remain size.
- Write
- (File_In,
- Buffer
- (1 .. Stream_Element_Offset
- (File_Size - Buffer'Length * Buffer_Count)));
- Flush (File_In);
- Close (File_In);
- end Generate_File;
- ---------------------
- -- Print_Statistic --
- ---------------------
- procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is
- use Ada.Calendar;
- use Ada.Text_IO;
- package Count_IO is new Integer_IO (ZLib.Count);
- Curr_Dur : Duration := Clock - Time_Stamp;
- begin
- Put (Msg);
- Set_Col (20);
- Ada.Text_IO.Put ("size =");
- Count_IO.Put
- (Data_Size,
- Width => Stream_IO.Count'Image (File_Size)'Length);
- Put_Line (" duration =" & Duration'Image (Curr_Dur));
- end Print_Statistic;
- -----------
- -- Stamp --
- -----------
- procedure Stamp is
- begin
- Time_Stamp := Ada.Calendar.Clock;
- end Stamp;
- begin
- Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
- loop
- Generate_File;
- for Level in ZLib.Compression_Level'Range loop
- Ada.Text_IO.Put_Line ("Level ="
- & ZLib.Compression_Level'Image (Level));
- -- Test generic interface.
- Open (File_In, In_File, In_File_Name);
- Create (File_Out, Out_File, Z_File_Name);
- Stamp;
- -- Deflate using generic instantiation.
- ZLib.Deflate_Init
- (Filter => Filter,
- Level => Level,
- Strategy => Strategy,
- Header => Header);
- Translate (Filter);
- Print_Statistic ("Generic compress", ZLib.Total_Out (Filter));
- ZLib.Close (Filter);
- Close (File_In);
- Close (File_Out);
- Open (File_In, In_File, Z_File_Name);
- Create (File_Out, Out_File, Out_File_Name);
- Stamp;
- -- Inflate using generic instantiation.
- ZLib.Inflate_Init (Filter, Header => Header);
- Translate (Filter);
- Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter));
- ZLib.Close (Filter);
- Close (File_In);
- Close (File_Out);
- Compare_Files (In_File_Name, Out_File_Name);
- -- Test stream interface.
- -- Compress to the back stream.
- Open (File_In, In_File, In_File_Name);
- Create (File_Back, Out_File, Z_File_Name);
- Stamp;
- ZLib.Streams.Create
- (Stream => File_Z,
- Mode => ZLib.Streams.Out_Stream,
- Back => ZLib.Streams.Stream_Access
- (Stream (File_Back)),
- Back_Compressed => True,
- Level => Level,
- Strategy => Strategy,
- Header => Header);
- Copy_Streams
- (Source => Stream (File_In).all,
- Target => File_Z);
- -- Flushing internal buffers to the back stream.
- ZLib.Streams.Flush (File_Z, ZLib.Finish);
- Print_Statistic ("Write compress",
- ZLib.Streams.Write_Total_Out (File_Z));
- ZLib.Streams.Close (File_Z);
- Close (File_In);
- Close (File_Back);
- -- Compare reading from original file and from
- -- decompression stream.
- Open (File_In, In_File, In_File_Name);
- Open (File_Back, In_File, Z_File_Name);
- ZLib.Streams.Create
- (Stream => File_Z,
- Mode => ZLib.Streams.In_Stream,
- Back => ZLib.Streams.Stream_Access
- (Stream (File_Back)),
- Back_Compressed => True,
- Header => Header);
- Stamp;
- Compare_Streams (Stream (File_In).all, File_Z);
- Print_Statistic ("Read decompress",
- ZLib.Streams.Read_Total_Out (File_Z));
- ZLib.Streams.Close (File_Z);
- Close (File_In);
- Close (File_Back);
- -- Compress by reading from compression stream.
- Open (File_Back, In_File, In_File_Name);
- Create (File_Out, Out_File, Z_File_Name);
- ZLib.Streams.Create
- (Stream => File_Z,
- Mode => ZLib.Streams.In_Stream,
- Back => ZLib.Streams.Stream_Access
- (Stream (File_Back)),
- Back_Compressed => False,
- Level => Level,
- Strategy => Strategy,
- Header => Header);
- Stamp;
- Copy_Streams
- (Source => File_Z,
- Target => Stream (File_Out).all);
- Print_Statistic ("Read compress",
- ZLib.Streams.Read_Total_Out (File_Z));
- ZLib.Streams.Close (File_Z);
- Close (File_Out);
- Close (File_Back);
- -- Decompress to decompression stream.
- Open (File_In, In_File, Z_File_Name);
- Create (File_Back, Out_File, Out_File_Name);
- ZLib.Streams.Create
- (Stream => File_Z,
- Mode => ZLib.Streams.Out_Stream,
- Back => ZLib.Streams.Stream_Access
- (Stream (File_Back)),
- Back_Compressed => False,
- Header => Header);
- Stamp;
- Copy_Streams
- (Source => Stream (File_In).all,
- Target => File_Z);
- Print_Statistic ("Write decompress",
- ZLib.Streams.Write_Total_Out (File_Z));
- ZLib.Streams.Close (File_Z);
- Close (File_In);
- Close (File_Back);
- Compare_Files (In_File_Name, Out_File_Name);
- end loop;
- Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok.");
- exit when not Continuous;
- File_Size := File_Size + 1;
- end loop;
- end Test;
|