* Unchecked_Conversion vs Address-overlaying
@ 2013-05-26 23:34 Shark8
2013-05-27 2:33 ` Jeffrey Carter
2013-05-27 4:37 ` Per Sandberg
0 siblings, 2 replies; 3+ messages in thread
From: Shark8 @ 2013-05-26 23:34 UTC (permalink / raw)
I recently had to make a dump-function for a collection of bytes and was wondering if the method I chose (address-overlaying) was better than using Unchecked_Conversion or not.
------------------------------
-- The private type BLOB designates some collection of memory-data;
-- it is actually an access to a storage-array [of Storage-Elements].
-- It's sized to the Cell_Size that all the other types are given so
-- that they can be wrapped in a record and that pushed onto a stack.
Type BLOB is Not Null Access All System.Storage_Elements.Storage_Array
with
Size => Cell_Size;
-- Returns a hex-dump of the given BLOB.
Function Image( Item : BLOB ) Return String is
Use System, System.Storage_Elements;
-- Our undervalued friend, the Nybble and the Byte, as well
-- as a type that serves as a collection of bytes.
Subtype Nybble is Interfaces.Unsigned_8 Range 16#0#..16#F#;
Subtype Byte is Interfaces.Unsigned_8;
Type Byte_String is Array(Positive Range <>) of Byte;
-- Return a Hex Character for any given Nybble.
Function Nybble_to_Hex( Input : Nybble ) Return Character is
subtype Decimal is Nybble range 0..9;
Base : Constant Interfaces.Unsigned_8:=
( if Input in Decimal then Character'Pos('0')
else Character'Pos('A') - 10 );
begin
Return Character'Val( Base + Input );
End Nybble_To_Hex;
-- Return the string that is the hex-values for
-- the high- and low-nybbles of the given byte.
Function Image( Item : Byte ) Return String is
begin
Return ( 1 => Nybble_to_Hex(Item / 16), -- High
2 => Nybble_to_Hex(Item mod 16) ); -- Low
End Image;
-- Given a Byte_String return the string containing its Nybbles.
Function Image( Item : Byte_String ) return String is
begin
Case Item'Length is
when 0 => Return "";
when 1 => Return Image(Item(Item'First));
when others =>
declare
Head : String Renames Image(Item(Item'First));
subtype Tail_Range is Positive Range
Positive'Succ(Item'First)..Item'Last;
Tail : String Renames Image(Item(Tail_Range));
begin
Return Head & Tail;
end;
end case;
End Image;
-- Calculate the length of the BLOB, in bytes.
Length : Constant Natural:= (Item'Length*Storage_Array'Component_Size)
/ Byte'Object_Size;
Pragma Warnings(Off);
-- Create an overlayed, non-initializing variable of the proper size.
Image_String : Byte_String(1..Length)
with Import, Convention => Ada, Address => Item.All'Address;
Pragma Warnings(On);
begin
-- Return the image of that overlay.
Return Image(Image_String);
end Image;
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Unchecked_Conversion vs Address-overlaying
2013-05-26 23:34 Unchecked_Conversion vs Address-overlaying Shark8
@ 2013-05-27 2:33 ` Jeffrey Carter
2013-05-27 4:37 ` Per Sandberg
1 sibling, 0 replies; 3+ messages in thread
From: Jeffrey Carter @ 2013-05-27 2:33 UTC (permalink / raw)
On 05/26/2013 04:34 PM, Shark8 wrote:
>
> -- Our undervalued friend, the Nybble and the Byte, as well
> -- as a type that serves as a collection of bytes.
> Subtype Nybble is Interfaces.Unsigned_8 Range 16#0#..16#F#;
> Subtype Byte is Interfaces.Unsigned_8;
> Type Byte_String is Array(Positive Range <>) of Byte;
If Storage_Element and Unsigned_8 aren't the same size, it's unlikely that the
overlay will work, given this definition for Byte_String. So why not simply
assert Storage_Element'Size = 8 and work directly on the elements of Item.all?
--
Jeff Carter
"My mind is a raging torrent, flooded with rivulets of
thought, cascading into a waterfall of creative alternatives."
Blazing Saddles
89
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Unchecked_Conversion vs Address-overlaying
2013-05-26 23:34 Unchecked_Conversion vs Address-overlaying Shark8
2013-05-27 2:33 ` Jeffrey Carter
@ 2013-05-27 4:37 ` Per Sandberg
1 sibling, 0 replies; 3+ messages in thread
From: Per Sandberg @ 2013-05-27 4:37 UTC (permalink / raw)
On Sun, 26 May 2013 16:34:54 -0700 (PDT)
Shark8 <onewingedshark@gmail.com> wrote:
> I recently had to make a dump-function for a collection of bytes and
> was wondering if the method I chose (address-overlaying) was better
> than using Unchecked_Conversion or not.
>
> ------------------------------
>
> -- The private type BLOB designates some collection of
> memory-data; -- it is actually an access to a storage-array [of
> Storage-Elements]. -- It's sized to the Cell_Size that all the other
> types are given so -- that they can be wrapped in a record and that
> pushed onto a stack. Type BLOB is Not Null Access All
> System.Storage_Elements.Storage_Array with
> Size => Cell_Size;
>
>
> -- Returns a hex-dump of the given BLOB.
> Function Image( Item : BLOB ) Return String is
> Use System, System.Storage_Elements;
>
> -- Our undervalued friend, the Nybble and the Byte, as well
> -- as a type that serves as a collection of bytes.
> Subtype Nybble is Interfaces.Unsigned_8 Range
> 16#0#..16#F#; Subtype Byte is Interfaces.Unsigned_8;
> Type Byte_String is Array(Positive Range <>) of Byte;
>
> -- Return a Hex Character for any given Nybble.
> Function Nybble_to_Hex( Input : Nybble ) Return Character is
> subtype Decimal is Nybble range 0..9;
> Base : Constant Interfaces.Unsigned_8:=
> ( if Input in Decimal then
> Character'Pos('0') else Character'Pos('A') - 10 );
> begin
> Return Character'Val( Base + Input );
> End Nybble_To_Hex;
>
> -- Return the string that is the hex-values for
> -- the high- and low-nybbles of the given byte.
> Function Image( Item : Byte ) Return String is
> begin
> Return ( 1 => Nybble_to_Hex(Item / 16), -- High
> 2 => Nybble_to_Hex(Item mod 16) ); -- Low
> End Image;
>
> -- Given a Byte_String return the string containing its
> Nybbles. Function Image( Item : Byte_String ) return String is
> begin
> Case Item'Length is
> when 0 => Return "";
> when 1 => Return Image(Item(Item'First));
> when others =>
> declare
> Head : String Renames Image(Item(Item'First));
> subtype Tail_Range is Positive Range
> Positive'Succ(Item'First)..Item'Last;
>
> Tail : String Renames Image(Item(Tail_Range));
> begin
> Return Head & Tail;
> end;
> end case;
> End Image;
>
> -- Calculate the length of the BLOB, in bytes.
> Length : Constant Natural:=
> (Item'Length*Storage_Array'Component_Size) / Byte'Object_Size;
> Pragma Warnings(Off);
> -- Create an overlayed, non-initializing variable of the
> proper size. Image_String : Byte_String(1..Length)
> with Import, Convention => Ada, Address => Item.All'Address;
> Pragma Warnings(On);
> begin
> -- Return the image of that overlay.
> Return Image(Image_String);
> end Image;
And have a look on "GNAT.Memory_Dump".
/Per
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-05-27 4:37 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-26 23:34 Unchecked_Conversion vs Address-overlaying Shark8
2013-05-27 2:33 ` Jeffrey Carter
2013-05-27 4:37 ` Per Sandberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox