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,start X-Google-Attributes: gid103376,public From: mgk25@cl.cam.ac.uk (Markus Kuhn) Subject: Convert an address range into an array Date: 1999/06/06 Message-ID: <7jdjov$21$1@pegasus.csx.cam.ac.uk>#1/1 X-Deja-AN: 486270482 Organization: U of Cambridge Computer Lab, UK Newsgroups: comp.lang.ada Date: 1999-06-06T00:00:00+00:00 List-Id: 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. Markus -- Markus G. Kuhn, Computer Laboratory, University of Cambridge, UK Email: mkuhn at acm.org, WWW: