comp.lang.ada
 help / color / mirror / Atom feed
From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: String view of file
Date: Mon, 21 Nov 2022 17:52:14 +0200	[thread overview]
Message-ID: <ju1l5eFhfo4U1@mid.individual.net> (raw)
In-Reply-To: <tlfvjv$3q8j4$1@dont-email.me>

On 2022-11-21 15:48, Jeffrey R.Carter wrote:
> On 2022-11-21 09:30, Jesper Quorning wrote:
>>
>> Is it possible to write something like this with ADA
> 
> "Ada" is a woman's name, not an acronymn.
> 
>> package my_rw_file is new file
>>    (name => "whatever"
>>     ,mode => read_write
>>     ,implementation => standard -- or portable or fast
>>    );
>> package as_string is new. xxx(from => my_rw_file);
>>
>> -- parse (as_string);
>> package data is new parse (as_string, format => markdown); -- or whatever
> 
> If I presume that the '.' in the declaration of As_String is a typo, 
> what you have here is a sequence of related generic pkg instantiations, 
> so you can write this in Ada if you have the corresponding generic pkgs. 
> I have no idea what the result would provide.
> 
> If you want to read the arbitrary contents of a file into a String, 
> that's easily done:
> 
> with Ada.Directories;
> 
> package String_A_File is
>     use type Ada.Directories.File_Size;
> 
>     function File_As_String (Name : in String) return String with
>        Pre  => Ada.Directories.Exists (Name) and then
>                Ada.Directories.Size (Name) <=
>                Ada.Directories.File_Size (Integer'Last),
>        Post => File_As_String'Result'First = 1 and
>                File_As_String'Result'Last =
>                Integer (Ada.Directories.Size (Name) );
> end String_A_File;
> 
> with Ada.Sequential_IO;
> 
> package body String_A_File is
>     function File_As_String (Name : in String) return String is
>        subtype FAS is String (1 .. Integer (Ada.Directories.Size (Name) 
> ) );
> 
>        package FAS_IO is new Ada.Sequential_IO (Element_Type => FAS);
> 
>        File   : FAS_IO.File_Type;
>        Result : FAS;
>     begin -- File_As_String
>        FAS_IO.Open (File => File, Mode => FAS_IO.In_File, Name => Name);
>        FAS_IO.Read (File => File, Item => Result;
>        FAS_IO.Close (File => File);
> 
>        return Result;
>     end File_As_String;
> end String_A_File;
> 
> This presumes that Result will fit on the stack. If that's likely to be 
> a problem, then you will need to use Unbounded_String and read the file 
> Character by Character.


For the OP's benefit (Jeffrey of course knows this): an alternative to 
Unbounded_String is to allocate the Result string on the heap, and 
return an access to the heap string. With that method, you can still 
read the entire string with one call of FAS_IO.Read instead of Character 
by Character.

  reply	other threads:[~2022-11-21 15:52 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-21  8:30 String view of file Jesper Quorning
2022-11-21 13:01 ` G.B.
2022-11-21 13:48 ` Jeffrey R.Carter
2022-11-21 15:52   ` Niklas Holsti [this message]
2022-11-21 16:42     ` Jeffrey R.Carter
2022-11-21 17:29       ` Niklas Holsti
2022-11-21 15:18 ` Dmitry A. Kazakov
2022-11-21 16:11 ` Marius Amado-Alves
2022-11-21 17:29 ` Qunying
2022-11-21 21:43 ` Gautier write-only address
2023-01-01 23:36 ` Jesper Quorning
2023-01-02 18:57   ` Stephen Leake
2023-01-03 16:37   ` Jeffrey R.Carter
2023-01-03 17:02     ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox