-------------------------------------------------------------------------------------------------------------------- -- Copyright (c) 2013-2020, Luke A. Guest -- -- This software is provided 'as-is', without any express or implied -- warranty. In no event will the authors be held liable for any damages -- arising from the use of this software. -- -- Permission is granted to anyone to use this software for any purpose, -- including commercial applications, and to alter it and redistribute it -- freely, subject to the following restrictions: -- -- 1. The origin of this software must not be misrepresented; you must not -- claim that you wrote the original software. If you use this software -- in a product, an acknowledgment in the product documentation would be -- appreciated but is not required. -- -- 2. Altered source versions must be plainly marked as such, and must not be -- misrepresented as being the original software. -- -- 3. This notice may not be removed or altered from any source -- distribution. -------------------------------------------------------------------------------------------------------------------- with SDL.Error; package body SDL.RWops.Streams is use type Interfaces.C.unsigned_long; function Open (Op : in RWops) return RWops_Stream is begin return (Ada.Streams.Root_Stream_Type with Context => Op); end Open; procedure Open (Op : in RWops; Stream : out RWops_Stream) is begin Stream.Context := Op; end Open; procedure Close (Stream : in RWops_Stream) is begin Close (Stream.Context); end Close; overriding procedure Read (Stream : in out RWops_Stream; Item : out Ada.Streams.Stream_Element_Array; Last : out Ada.Streams.Stream_Element_Offset) is Objects_Read : Interfaces.C.unsigned_long := 0; begin -- Re-implemented c-macro: -- #define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) -- Read : access function -- (context : RWops_Pointer; -- ptr : System.Address; -- size : Interfaces.C.unsigned_long; -- maxnum : Interfaces.C.unsigned_long) return Interfaces.C.unsigned_long; Objects_Read := Stream.Context.Read (Context => RWops_Pointer (Stream.Context), Ptr => Item'Address, Size => Item'Length, Max_Num => 1); if Objects_Read = 0 then raise RWops_Error with SDL.Error.Get; end if; Last := Item'Length; end Read; overriding procedure Write (Stream : in out RWops_Stream; Item : Ada.Streams.Stream_Element_Array) is Objects_Written : Interfaces.C.unsigned_long := 0; begin -- Re-implemented c-macro: -- #define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) -- Write : access function -- (Context : RWops_Pointer; -- Ptr : System.Address; -- Size : Interfaces.C.unsigned_long; -- Num : Interfaces.C.unsigned_long) return Interfaces.C.unsigned_long; Objects_Written := Stream.Context.Write (Context => RWops_Pointer (Stream.Context), Ptr => Item'Address, Size => Item'Length, Num => 1); if Objects_Written = 0 then raise RWops_Error with SDL.Error.Get; end if; end Write; end SDL.RWops.Streams;