1275793eaSopenharmony_ci---------------------------------------------------------------- 2275793eaSopenharmony_ci-- ZLib for Ada thick binding. -- 3275793eaSopenharmony_ci-- -- 4275793eaSopenharmony_ci-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- 5275793eaSopenharmony_ci-- -- 6275793eaSopenharmony_ci-- Open source license information is in the zlib.ads file. -- 7275793eaSopenharmony_ci---------------------------------------------------------------- 8275793eaSopenharmony_ci 9275793eaSopenharmony_ci-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ 10275793eaSopenharmony_ci 11275793eaSopenharmony_ciwith Ada.Unchecked_Deallocation; 12275793eaSopenharmony_ci 13275793eaSopenharmony_cipackage body ZLib.Streams is 14275793eaSopenharmony_ci 15275793eaSopenharmony_ci ----------- 16275793eaSopenharmony_ci -- Close -- 17275793eaSopenharmony_ci ----------- 18275793eaSopenharmony_ci 19275793eaSopenharmony_ci procedure Close (Stream : in out Stream_Type) is 20275793eaSopenharmony_ci procedure Free is new Ada.Unchecked_Deallocation 21275793eaSopenharmony_ci (Stream_Element_Array, Buffer_Access); 22275793eaSopenharmony_ci begin 23275793eaSopenharmony_ci if Stream.Mode = Out_Stream or Stream.Mode = Duplex then 24275793eaSopenharmony_ci -- We should flush the data written by the writer. 25275793eaSopenharmony_ci 26275793eaSopenharmony_ci Flush (Stream, Finish); 27275793eaSopenharmony_ci 28275793eaSopenharmony_ci Close (Stream.Writer); 29275793eaSopenharmony_ci end if; 30275793eaSopenharmony_ci 31275793eaSopenharmony_ci if Stream.Mode = In_Stream or Stream.Mode = Duplex then 32275793eaSopenharmony_ci Close (Stream.Reader); 33275793eaSopenharmony_ci Free (Stream.Buffer); 34275793eaSopenharmony_ci end if; 35275793eaSopenharmony_ci end Close; 36275793eaSopenharmony_ci 37275793eaSopenharmony_ci ------------ 38275793eaSopenharmony_ci -- Create -- 39275793eaSopenharmony_ci ------------ 40275793eaSopenharmony_ci 41275793eaSopenharmony_ci procedure Create 42275793eaSopenharmony_ci (Stream : out Stream_Type; 43275793eaSopenharmony_ci Mode : in Stream_Mode; 44275793eaSopenharmony_ci Back : in Stream_Access; 45275793eaSopenharmony_ci Back_Compressed : in Boolean; 46275793eaSopenharmony_ci Level : in Compression_Level := Default_Compression; 47275793eaSopenharmony_ci Strategy : in Strategy_Type := Default_Strategy; 48275793eaSopenharmony_ci Header : in Header_Type := Default; 49275793eaSopenharmony_ci Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset 50275793eaSopenharmony_ci := Default_Buffer_Size; 51275793eaSopenharmony_ci Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset 52275793eaSopenharmony_ci := Default_Buffer_Size) 53275793eaSopenharmony_ci is 54275793eaSopenharmony_ci 55275793eaSopenharmony_ci subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); 56275793eaSopenharmony_ci 57275793eaSopenharmony_ci procedure Init_Filter 58275793eaSopenharmony_ci (Filter : in out Filter_Type; 59275793eaSopenharmony_ci Compress : in Boolean); 60275793eaSopenharmony_ci 61275793eaSopenharmony_ci ----------------- 62275793eaSopenharmony_ci -- Init_Filter -- 63275793eaSopenharmony_ci ----------------- 64275793eaSopenharmony_ci 65275793eaSopenharmony_ci procedure Init_Filter 66275793eaSopenharmony_ci (Filter : in out Filter_Type; 67275793eaSopenharmony_ci Compress : in Boolean) is 68275793eaSopenharmony_ci begin 69275793eaSopenharmony_ci if Compress then 70275793eaSopenharmony_ci Deflate_Init 71275793eaSopenharmony_ci (Filter, Level, Strategy, Header => Header); 72275793eaSopenharmony_ci else 73275793eaSopenharmony_ci Inflate_Init (Filter, Header => Header); 74275793eaSopenharmony_ci end if; 75275793eaSopenharmony_ci end Init_Filter; 76275793eaSopenharmony_ci 77275793eaSopenharmony_ci begin 78275793eaSopenharmony_ci Stream.Back := Back; 79275793eaSopenharmony_ci Stream.Mode := Mode; 80275793eaSopenharmony_ci 81275793eaSopenharmony_ci if Mode = Out_Stream or Mode = Duplex then 82275793eaSopenharmony_ci Init_Filter (Stream.Writer, Back_Compressed); 83275793eaSopenharmony_ci Stream.Buffer_Size := Write_Buffer_Size; 84275793eaSopenharmony_ci else 85275793eaSopenharmony_ci Stream.Buffer_Size := 0; 86275793eaSopenharmony_ci end if; 87275793eaSopenharmony_ci 88275793eaSopenharmony_ci if Mode = In_Stream or Mode = Duplex then 89275793eaSopenharmony_ci Init_Filter (Stream.Reader, not Back_Compressed); 90275793eaSopenharmony_ci 91275793eaSopenharmony_ci Stream.Buffer := new Buffer_Subtype; 92275793eaSopenharmony_ci Stream.Rest_First := Stream.Buffer'Last + 1; 93275793eaSopenharmony_ci Stream.Rest_Last := Stream.Buffer'Last; 94275793eaSopenharmony_ci end if; 95275793eaSopenharmony_ci end Create; 96275793eaSopenharmony_ci 97275793eaSopenharmony_ci ----------- 98275793eaSopenharmony_ci -- Flush -- 99275793eaSopenharmony_ci ----------- 100275793eaSopenharmony_ci 101275793eaSopenharmony_ci procedure Flush 102275793eaSopenharmony_ci (Stream : in out Stream_Type; 103275793eaSopenharmony_ci Mode : in Flush_Mode := Sync_Flush) 104275793eaSopenharmony_ci is 105275793eaSopenharmony_ci Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); 106275793eaSopenharmony_ci Last : Stream_Element_Offset; 107275793eaSopenharmony_ci begin 108275793eaSopenharmony_ci loop 109275793eaSopenharmony_ci Flush (Stream.Writer, Buffer, Last, Mode); 110275793eaSopenharmony_ci 111275793eaSopenharmony_ci Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); 112275793eaSopenharmony_ci 113275793eaSopenharmony_ci exit when Last < Buffer'Last; 114275793eaSopenharmony_ci end loop; 115275793eaSopenharmony_ci end Flush; 116275793eaSopenharmony_ci 117275793eaSopenharmony_ci ------------- 118275793eaSopenharmony_ci -- Is_Open -- 119275793eaSopenharmony_ci ------------- 120275793eaSopenharmony_ci 121275793eaSopenharmony_ci function Is_Open (Stream : Stream_Type) return Boolean is 122275793eaSopenharmony_ci begin 123275793eaSopenharmony_ci return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); 124275793eaSopenharmony_ci end Is_Open; 125275793eaSopenharmony_ci 126275793eaSopenharmony_ci ---------- 127275793eaSopenharmony_ci -- Read -- 128275793eaSopenharmony_ci ---------- 129275793eaSopenharmony_ci 130275793eaSopenharmony_ci procedure Read 131275793eaSopenharmony_ci (Stream : in out Stream_Type; 132275793eaSopenharmony_ci Item : out Stream_Element_Array; 133275793eaSopenharmony_ci Last : out Stream_Element_Offset) 134275793eaSopenharmony_ci is 135275793eaSopenharmony_ci 136275793eaSopenharmony_ci procedure Read 137275793eaSopenharmony_ci (Item : out Stream_Element_Array; 138275793eaSopenharmony_ci Last : out Stream_Element_Offset); 139275793eaSopenharmony_ci 140275793eaSopenharmony_ci ---------- 141275793eaSopenharmony_ci -- Read -- 142275793eaSopenharmony_ci ---------- 143275793eaSopenharmony_ci 144275793eaSopenharmony_ci procedure Read 145275793eaSopenharmony_ci (Item : out Stream_Element_Array; 146275793eaSopenharmony_ci Last : out Stream_Element_Offset) is 147275793eaSopenharmony_ci begin 148275793eaSopenharmony_ci Ada.Streams.Read (Stream.Back.all, Item, Last); 149275793eaSopenharmony_ci end Read; 150275793eaSopenharmony_ci 151275793eaSopenharmony_ci procedure Read is new ZLib.Read 152275793eaSopenharmony_ci (Read => Read, 153275793eaSopenharmony_ci Buffer => Stream.Buffer.all, 154275793eaSopenharmony_ci Rest_First => Stream.Rest_First, 155275793eaSopenharmony_ci Rest_Last => Stream.Rest_Last); 156275793eaSopenharmony_ci 157275793eaSopenharmony_ci begin 158275793eaSopenharmony_ci Read (Stream.Reader, Item, Last); 159275793eaSopenharmony_ci end Read; 160275793eaSopenharmony_ci 161275793eaSopenharmony_ci ------------------- 162275793eaSopenharmony_ci -- Read_Total_In -- 163275793eaSopenharmony_ci ------------------- 164275793eaSopenharmony_ci 165275793eaSopenharmony_ci function Read_Total_In (Stream : in Stream_Type) return Count is 166275793eaSopenharmony_ci begin 167275793eaSopenharmony_ci return Total_In (Stream.Reader); 168275793eaSopenharmony_ci end Read_Total_In; 169275793eaSopenharmony_ci 170275793eaSopenharmony_ci -------------------- 171275793eaSopenharmony_ci -- Read_Total_Out -- 172275793eaSopenharmony_ci -------------------- 173275793eaSopenharmony_ci 174275793eaSopenharmony_ci function Read_Total_Out (Stream : in Stream_Type) return Count is 175275793eaSopenharmony_ci begin 176275793eaSopenharmony_ci return Total_Out (Stream.Reader); 177275793eaSopenharmony_ci end Read_Total_Out; 178275793eaSopenharmony_ci 179275793eaSopenharmony_ci ----------- 180275793eaSopenharmony_ci -- Write -- 181275793eaSopenharmony_ci ----------- 182275793eaSopenharmony_ci 183275793eaSopenharmony_ci procedure Write 184275793eaSopenharmony_ci (Stream : in out Stream_Type; 185275793eaSopenharmony_ci Item : in Stream_Element_Array) 186275793eaSopenharmony_ci is 187275793eaSopenharmony_ci 188275793eaSopenharmony_ci procedure Write (Item : in Stream_Element_Array); 189275793eaSopenharmony_ci 190275793eaSopenharmony_ci ----------- 191275793eaSopenharmony_ci -- Write -- 192275793eaSopenharmony_ci ----------- 193275793eaSopenharmony_ci 194275793eaSopenharmony_ci procedure Write (Item : in Stream_Element_Array) is 195275793eaSopenharmony_ci begin 196275793eaSopenharmony_ci Ada.Streams.Write (Stream.Back.all, Item); 197275793eaSopenharmony_ci end Write; 198275793eaSopenharmony_ci 199275793eaSopenharmony_ci procedure Write is new ZLib.Write 200275793eaSopenharmony_ci (Write => Write, 201275793eaSopenharmony_ci Buffer_Size => Stream.Buffer_Size); 202275793eaSopenharmony_ci 203275793eaSopenharmony_ci begin 204275793eaSopenharmony_ci Write (Stream.Writer, Item, No_Flush); 205275793eaSopenharmony_ci end Write; 206275793eaSopenharmony_ci 207275793eaSopenharmony_ci -------------------- 208275793eaSopenharmony_ci -- Write_Total_In -- 209275793eaSopenharmony_ci -------------------- 210275793eaSopenharmony_ci 211275793eaSopenharmony_ci function Write_Total_In (Stream : in Stream_Type) return Count is 212275793eaSopenharmony_ci begin 213275793eaSopenharmony_ci return Total_In (Stream.Writer); 214275793eaSopenharmony_ci end Write_Total_In; 215275793eaSopenharmony_ci 216275793eaSopenharmony_ci --------------------- 217275793eaSopenharmony_ci -- Write_Total_Out -- 218275793eaSopenharmony_ci --------------------- 219275793eaSopenharmony_ci 220275793eaSopenharmony_ci function Write_Total_Out (Stream : in Stream_Type) return Count is 221275793eaSopenharmony_ci begin 222275793eaSopenharmony_ci return Total_Out (Stream.Writer); 223275793eaSopenharmony_ci end Write_Total_Out; 224275793eaSopenharmony_ci 225275793eaSopenharmony_ciend ZLib.Streams; 226