From: Matthew Heaney <matthew_heaney@acm.org>
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: <m3pv394a33.fsf@mheaney.ni.net> (raw)
In-Reply-To: 7jdjov$21$1@pegasus.csx.cam.ac.uk
mgk25@cl.cam.ac.uk (Markus Kuhn) writes:
> 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
>
> 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.
How about:
declare
Length : constant Storage_Offset := B - A + 1;
S : String (1 .. Length);
for S'Address use A;
begin
Op (S);
end;
Won't this work?
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 ` Robert Dewar
1999-06-06 0:00 ` Matthew Heaney [this message]
1999-06-06 0:00 ` David C. Hoos, Sr.
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox