From: "David C. Hoos, Sr." <david.c.hoos.sr@ada95.com>
Subject: Re: Convert an address range into an array
Date: 1999/06/06
Date: 1999-06-06T00:00:00+00:00 [thread overview]
Message-ID: <JAnShTBs#GA.145@newstoo.hiwaay.net> (raw)
In-Reply-To: 7jdjov$21$1@pegasus.csx.cam.ac.uk
Markus Kuhn <mgk25@cl.cam.ac.uk> wrote in message
news:7jdjov$21$1@pegasus.csx.cam.ac.uk...
> Problem: I have memory-mapped a file into my address space using
> mmap(). I have parsed data structures in this file and I have located
> a continuous string of characters in the address range A to B.
> I now want to convert this address range into an Ada String type,
> which I can then pass on to a procedure that expects a String
> parameter. I do NOT want to copy the (potentially very large)
> sequence of bytes for performance reasons.
>
> Basically, I want to get somehow a value
>
> S : String;
>
> such that
>
> S(S'First)'Access = A
> S(S'Last)'Access = B
> S'First = 1
>
First, this would be a violation of Ada's strong type model, because
you are asking access values to be equal to addresses.
> which I can then pass on to a prodecure without copying the bytes.
> All I want to allocate is the (First,Last) meta-data of the array,
> not the array data itself. In other words, I want to combine the
> efficiency of C's pointer+length representation of memory chunks
> with the comfort and safety of Ada's arrays, but none of the
> textbooks explain how to do this.
>
> What is the proper Ada way of turning a variable address range
> into an array located there? Representation clauses? Or should the
> efficient zero-copying handling of memory mapped files, packet
> headers, etc. better be done via good old pointer arithmetic
> like in C?
>
> The compiler is GNAT on Linux, but the most portable solution
> would be preferred.
>
My solution would be the code which is at the end of this message.
Although the code would not be guaranteed (by the RM) to have
pass-by-reference semantics, examination of the assembly code
generated by GNAT does, and I would suspect that other compilers
would, too, given the nature of strings.
-- begin source code --
with Ada.Text_IO;
with System.Storage_Elements;
procedure Kuhn is
type String_Access is access all String;
Start_Address : System.Address;
End_Address : System.Address;
procedure Show_String (The_String : String) is
begin
Ada.Text_IO.Put_Line (The_String);
end Show_String;
The_String : String :=
"junk The quick brown fox jumps over the lazy dog's back. junk";
begin
Start_Address := The_String (5)'Address;
End_Address := The_String(The_String'Last - 5)'Address;
declare
use type System.Storage_Elements.Storage_Count;
String_Length : Natural :=
Natural (End_Address - Start_Address + 1);
The_String : String (1 .. String_Length);
for The_String'Address use Start_Address;
begin
Show_String (The_String);
end;
end Kuhn;
-- end source code --
next prev parent reply other threads:[~1999-06-06 0:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-06-06 0:00 Convert an address range into an array Markus Kuhn
1999-06-06 0:00 ` David C. Hoos, Sr. [this message]
1999-06-06 0:00 ` Matthew Heaney
1999-06-06 0:00 ` Robert Dewar
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox