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; 157