From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,76be2011d1dba323 X-Google-Attributes: gid103376,public From: Matthew Heaney Subject: Re: Convert an address range into an array Date: 1999/06/06 Message-ID: #1/1 X-Deja-AN: 486332286 References: <7jdjov$21$1@pegasus.csx.cam.ac.uk> NNTP-Posting-Date: Sun, 06 Jun 1999 08:28:14 PDT Newsgroups: comp.lang.ada Date: 1999-06-06T00:00:00+00:00 List-Id: 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?