comp.lang.ada
 help / color / mirror / Atom feed
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?

  




  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