raw
smg_comms_genesis       1   -- S.MG, 2018
smg_comms_genesis 2 -- prototype implementation of S.MG communication protocol
smg_comms_genesis 3
smg_comms_genesis 4 with SMG_comms_types; use SMG_comms_types;
smg_comms_genesis 5 with System; use System; -- endianness
smg_comms_genesis 6 with Ada.Exceptions;
smg_comms_genesis 7 with Ada.Streams; use Ada.Streams;
smg_comms_genesis 8
smg_comms_genesis 9 package body SMG_comms_types is
smg_comms_genesis 10
smg_comms_genesis 11 -- to and from network format (i.e. big endian, stream_element_array)
smg_comms_genesis 12 procedure ToNetworkFormat(
smg_comms_genesis 13 Item : in Octet_Array;
smg_comms_genesis 14 Buffer : out Stream_Element_Array) is
smg_comms_genesis 15 begin
smg_comms_genesis 16 if Item'Length /= Buffer'Length then
smg_comms_genesis 17 raise Constraint_Error with "Item and Buffer lengths do NOT match!";
smg_comms_genesis 18 end if;
smg_comms_genesis 19
smg_comms_genesis 20 if Default_Bit_Order = Low_Order_First then
smg_comms_genesis 21 for I in 0 .. Item'Length - 1 loop
smg_comms_genesis 22 Buffer( Buffer'Last - Stream_Element_Offset(I) ) := Stream_Element(Item(Item'First + I));
smg_comms_genesis 23 end loop;
smg_comms_genesis 24 else
smg_comms_genesis 25 for I in 0 .. Item'Length - 1 loop
smg_comms_genesis 26 Buffer( Buffer'First + Stream_Element_Offset(I) ) := Stream_Element(Item(Item'First + I));
smg_comms_genesis 27 end loop;
smg_comms_genesis 28 end if;
smg_comms_genesis 29 end ToNetworkFormat;
smg_comms_genesis 30
smg_comms_genesis 31 procedure FromNetworkFormat(
smg_comms_genesis 32 Buffer : in Stream_Element_Array;
smg_comms_genesis 33 Item : out Octet_Array) is
smg_comms_genesis 34 begin
smg_comms_genesis 35 if Item'Length /= Buffer'Length then
smg_comms_genesis 36 raise Constraint_Error with "Buffer and Item length do NOT match!";
smg_comms_genesis 37 end if;
smg_comms_genesis 38
smg_comms_genesis 39 if Default_Bit_Order = Low_Order_First then
smg_comms_genesis 40 for I in 0 .. Buffer'Length - 1 loop
smg_comms_genesis 41 Item( Item'Last - I ) :=
smg_comms_genesis 42 Unsigned_8( Buffer( Buffer'First + Stream_Element_Offset( I ) ) );
smg_comms_genesis 43 end loop;
smg_comms_genesis 44 else
smg_comms_genesis 45 for I in 0 .. Buffer'Length - 1 loop
smg_comms_genesis 46 Item( Item'First + I ) :=
smg_comms_genesis 47 Unsigned_8( Buffer( Buffer'First + Stream_Element_Offset( I ) ) );
smg_comms_genesis 48 end loop;
smg_comms_genesis 49 end if;
smg_comms_genesis 50 end FromNetworkFormat;
smg_comms_genesis 51
smg_comms_genesis 52 -- Integer_8
smg_comms_genesis 53 procedure ToNetworkFormat(
smg_comms_genesis 54 Item : in Integer_8;
smg_comms_genesis 55 Buffer : out Stream_Element_Array) is
smg_comms_genesis 56 begin
smg_comms_genesis 57 ToNetworkFormat( Cast( Item ), Buffer );
smg_comms_genesis 58 end ToNetworkFormat;
smg_comms_genesis 59
smg_comms_genesis 60 procedure FromNetworkFormat(
smg_comms_genesis 61 Buffer : in Stream_Element_Array;
smg_comms_genesis 62 Item : out Integer_8) is
smg_comms_genesis 63 octets: Octets_1;
smg_comms_genesis 64 begin
smg_comms_genesis 65 FromNetworkFormat(Buffer, octets);
smg_comms_genesis 66 Item := Cast( octets );
smg_comms_genesis 67 end FromNetworkFormat;
smg_comms_genesis 68
smg_comms_genesis 69 end SMG_comms_types;