1 1.1 christos ---------------------------------------------------------------- 2 1.1 christos -- ZLib for Ada thick binding. -- 3 1.1 christos -- -- 4 1.1 christos -- Copyright (C) 2002-2003 Dmitriy Anisimkov -- 5 1.1 christos -- -- 6 1.1 christos -- Open source license information is in the zlib.ads file. -- 7 1.1 christos ---------------------------------------------------------------- 8 1.1 christos 9 1.1.1.3 christos -- Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp 10 1.1 christos 11 1.1 christos with Ada.Unchecked_Deallocation; 12 1.1 christos 13 1.1 christos package body ZLib.Streams is 14 1.1 christos 15 1.1 christos ----------- 16 1.1 christos -- Close -- 17 1.1 christos ----------- 18 1.1 christos 19 1.1 christos procedure Close (Stream : in out Stream_Type) is 20 1.1 christos procedure Free is new Ada.Unchecked_Deallocation 21 1.1 christos (Stream_Element_Array, Buffer_Access); 22 1.1 christos begin 23 1.1 christos if Stream.Mode = Out_Stream or Stream.Mode = Duplex then 24 1.1 christos -- We should flush the data written by the writer. 25 1.1 christos 26 1.1 christos Flush (Stream, Finish); 27 1.1 christos 28 1.1 christos Close (Stream.Writer); 29 1.1 christos end if; 30 1.1 christos 31 1.1 christos if Stream.Mode = In_Stream or Stream.Mode = Duplex then 32 1.1 christos Close (Stream.Reader); 33 1.1 christos Free (Stream.Buffer); 34 1.1 christos end if; 35 1.1 christos end Close; 36 1.1 christos 37 1.1 christos ------------ 38 1.1 christos -- Create -- 39 1.1 christos ------------ 40 1.1 christos 41 1.1 christos procedure Create 42 1.1 christos (Stream : out Stream_Type; 43 1.1 christos Mode : in Stream_Mode; 44 1.1 christos Back : in Stream_Access; 45 1.1 christos Back_Compressed : in Boolean; 46 1.1 christos Level : in Compression_Level := Default_Compression; 47 1.1 christos Strategy : in Strategy_Type := Default_Strategy; 48 1.1 christos Header : in Header_Type := Default; 49 1.1 christos Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset 50 1.1 christos := Default_Buffer_Size; 51 1.1 christos Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset 52 1.1 christos := Default_Buffer_Size) 53 1.1 christos is 54 1.1 christos 55 1.1 christos subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); 56 1.1 christos 57 1.1 christos procedure Init_Filter 58 1.1 christos (Filter : in out Filter_Type; 59 1.1 christos Compress : in Boolean); 60 1.1 christos 61 1.1 christos ----------------- 62 1.1 christos -- Init_Filter -- 63 1.1 christos ----------------- 64 1.1 christos 65 1.1 christos procedure Init_Filter 66 1.1 christos (Filter : in out Filter_Type; 67 1.1 christos Compress : in Boolean) is 68 1.1 christos begin 69 1.1 christos if Compress then 70 1.1 christos Deflate_Init 71 1.1 christos (Filter, Level, Strategy, Header => Header); 72 1.1 christos else 73 1.1 christos Inflate_Init (Filter, Header => Header); 74 1.1 christos end if; 75 1.1 christos end Init_Filter; 76 1.1 christos 77 1.1 christos begin 78 1.1 christos Stream.Back := Back; 79 1.1 christos Stream.Mode := Mode; 80 1.1 christos 81 1.1 christos if Mode = Out_Stream or Mode = Duplex then 82 1.1 christos Init_Filter (Stream.Writer, Back_Compressed); 83 1.1 christos Stream.Buffer_Size := Write_Buffer_Size; 84 1.1 christos else 85 1.1 christos Stream.Buffer_Size := 0; 86 1.1 christos end if; 87 1.1 christos 88 1.1 christos if Mode = In_Stream or Mode = Duplex then 89 1.1 christos Init_Filter (Stream.Reader, not Back_Compressed); 90 1.1 christos 91 1.1 christos Stream.Buffer := new Buffer_Subtype; 92 1.1 christos Stream.Rest_First := Stream.Buffer'Last + 1; 93 1.1 christos Stream.Rest_Last := Stream.Buffer'Last; 94 1.1 christos end if; 95 1.1 christos end Create; 96 1.1 christos 97 1.1 christos ----------- 98 1.1 christos -- Flush -- 99 1.1 christos ----------- 100 1.1 christos 101 1.1 christos procedure Flush 102 1.1 christos (Stream : in out Stream_Type; 103 1.1 christos Mode : in Flush_Mode := Sync_Flush) 104 1.1 christos is 105 1.1 christos Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); 106 1.1 christos Last : Stream_Element_Offset; 107 1.1 christos begin 108 1.1 christos loop 109 1.1 christos Flush (Stream.Writer, Buffer, Last, Mode); 110 1.1 christos 111 1.1 christos Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); 112 1.1 christos 113 1.1 christos exit when Last < Buffer'Last; 114 1.1 christos end loop; 115 1.1 christos end Flush; 116 1.1 christos 117 1.1 christos ------------- 118 1.1 christos -- Is_Open -- 119 1.1 christos ------------- 120 1.1 christos 121 1.1 christos function Is_Open (Stream : Stream_Type) return Boolean is 122 1.1 christos begin 123 1.1 christos return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); 124 1.1 christos end Is_Open; 125 1.1 christos 126 1.1 christos ---------- 127 1.1 christos -- Read -- 128 1.1 christos ---------- 129 1.1 christos 130 1.1 christos procedure Read 131 1.1 christos (Stream : in out Stream_Type; 132 1.1 christos Item : out Stream_Element_Array; 133 1.1 christos Last : out Stream_Element_Offset) 134 1.1 christos is 135 1.1 christos 136 1.1 christos procedure Read 137 1.1 christos (Item : out Stream_Element_Array; 138 1.1 christos Last : out Stream_Element_Offset); 139 1.1 christos 140 1.1 christos ---------- 141 1.1 christos -- Read -- 142 1.1 christos ---------- 143 1.1 christos 144 1.1 christos procedure Read 145 1.1 christos (Item : out Stream_Element_Array; 146 1.1 christos Last : out Stream_Element_Offset) is 147 1.1 christos begin 148 1.1 christos Ada.Streams.Read (Stream.Back.all, Item, Last); 149 1.1 christos end Read; 150 1.1 christos 151 1.1 christos procedure Read is new ZLib.Read 152 1.1 christos (Read => Read, 153 1.1 christos Buffer => Stream.Buffer.all, 154 1.1 christos Rest_First => Stream.Rest_First, 155 1.1 christos Rest_Last => Stream.Rest_Last); 156 1.1 christos 157 1.1 christos begin 158 1.1 christos Read (Stream.Reader, Item, Last); 159 1.1 christos end Read; 160 1.1 christos 161 1.1 christos ------------------- 162 1.1 christos -- Read_Total_In -- 163 1.1 christos ------------------- 164 1.1 christos 165 1.1 christos function Read_Total_In (Stream : in Stream_Type) return Count is 166 1.1 christos begin 167 1.1 christos return Total_In (Stream.Reader); 168 1.1 christos end Read_Total_In; 169 1.1 christos 170 1.1 christos -------------------- 171 1.1 christos -- Read_Total_Out -- 172 1.1 christos -------------------- 173 1.1 christos 174 1.1 christos function Read_Total_Out (Stream : in Stream_Type) return Count is 175 1.1 christos begin 176 1.1 christos return Total_Out (Stream.Reader); 177 1.1 christos end Read_Total_Out; 178 1.1 christos 179 1.1 christos ----------- 180 1.1 christos -- Write -- 181 1.1 christos ----------- 182 1.1 christos 183 1.1 christos procedure Write 184 1.1 christos (Stream : in out Stream_Type; 185 1.1 christos Item : in Stream_Element_Array) 186 1.1 christos is 187 1.1 christos 188 1.1 christos procedure Write (Item : in Stream_Element_Array); 189 1.1 christos 190 1.1 christos ----------- 191 1.1 christos -- Write -- 192 1.1 christos ----------- 193 1.1 christos 194 1.1 christos procedure Write (Item : in Stream_Element_Array) is 195 1.1 christos begin 196 1.1 christos Ada.Streams.Write (Stream.Back.all, Item); 197 1.1 christos end Write; 198 1.1 christos 199 1.1 christos procedure Write is new ZLib.Write 200 1.1 christos (Write => Write, 201 1.1 christos Buffer_Size => Stream.Buffer_Size); 202 1.1 christos 203 1.1 christos begin 204 1.1 christos Write (Stream.Writer, Item, No_Flush); 205 1.1 christos end Write; 206 1.1 christos 207 1.1 christos -------------------- 208 1.1 christos -- Write_Total_In -- 209 1.1 christos -------------------- 210 1.1 christos 211 1.1 christos function Write_Total_In (Stream : in Stream_Type) return Count is 212 1.1 christos begin 213 1.1 christos return Total_In (Stream.Writer); 214 1.1 christos end Write_Total_In; 215 1.1 christos 216 1.1 christos --------------------- 217 1.1 christos -- Write_Total_Out -- 218 1.1 christos --------------------- 219 1.1 christos 220 1.1 christos function Write_Total_Out (Stream : in Stream_Type) return Count is 221 1.1 christos begin 222 1.1 christos return Total_Out (Stream.Writer); 223 1.1 christos end Write_Total_Out; 224 1.1 christos 225 1.1 christos end ZLib.Streams; 226