agpl_1.0.0_b5da3320/src/agpl-filesystem.adb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 

with Agpl.Strings.Fields;

with Ada.Streams.Stream_Io;

package body Agpl.Filesystem is

   ------------------
   -- Ensure_Slash --
   ------------------

   function Ensure_Slash (This : in String; Separator : in Character := '/')
      return String is
   begin
      if This (This'Last) /= Separator then
         return This & Separator;
      else
         return This;
      end if;
   end Ensure_Slash;

   -----------------------
   -- Replace_Extension --
   -----------------------

   function Replace_Extension (This : in String; New_Ext : in String)
                               return    String
   is
   begin
      return Strings.Fields.String_Tail_Reverse (This, '.') & '.' & New_Ext;
   end Replace_Extension;

   ---------------
   -- Read_File --
   ---------------

   function Read_File (Name : String) return Ustring is
      Result : Ustring;
      use Ada.Streams.Stream_Io;
      F      : File_Type;
   begin
      Open (F, In_File, Name);
      declare
         Length : constant Natural := Natural (Size (F));
         Remain :          Natural := Length;
         Stream : constant Stream_Access := Ada.Streams.Stream_Io.Stream (F);
      begin
         while Remain > 0 loop
            declare
               Chunk : String (1 .. Natural'Min (Remain, 1000));
            begin
               String'Read (Stream, Chunk);
               Asu.Append (Result, Chunk);
               Remain := Remain - Chunk'Length;
            end;
         end loop;
      end;
      Close (F);
      return Result;
   exception
      when others =>
         Close (F);
         raise;
   end Read_File;

end Agpl.Filesystem;