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