1-- NB: implementation for test purposes, very slow !!
2
3with Ada.Sequential_IO;
4
5package body RW_File is
6
7   package Character_Sequential_IO is new Ada.Sequential_IO (Character);
8
9   procedure Read_File (Filename : String; Content : out Unbounded_String) is
10      package Io renames Character_Sequential_IO;
11      use Io;
12      F : Io.File_Type;
13      Ch : Character;
14   begin
15      Content := Null_Unbounded_String;
16      Open (F, In_File, Filename);
17      while not End_Of_File (F) loop
18         Read (F, Ch);
19         Append (Content, Ch);
20      end loop;
21      Close (F);
22   exception when others =>
23         if Is_Open (F) then
24            Close (F);
25         end if;
26         raise;
27   end Read_File;
28
29   procedure Write_File (Filename : String;
30                         Content : Unbounded_String) is
31      package Io renames Character_Sequential_IO;
32      use Io;
33      F : Io.File_Type;
34   begin
35      Create (F, Out_File, Filename);
36      for I in 1 .. Length (Content) loop
37         Io.Write (F, Element (Content, I));
38      end loop;
39      Close (F);
40   exception when others =>
41         if Is_Open (F) then
42            Close (F);
43         end if;
44         raise;
45   end Write_File;
46
47   procedure Process_Lines (S : Unbounded_String;
48                            Process_Line : Line_processing) is
49
50      function Is_Text (Ch : Character) return Boolean is
51      begin
52         return Ch >= ' ' or else Ch = ASCII.HT;
53      end Is_Text;
54
55      Last : constant Integer := Length (S);
56      From : Integer := 1;
57      Upto1, Upto2 : Integer;
58   begin
59      while From < Last loop
60         Upto1 := From;
61         while Upto1 < Last and then
62               Is_Text (Ada.Strings.Unbounded.Element (S, Upto1 + 1)) loop
63            Upto1 := Upto1 + 1;
64         end loop;
65         Upto2 := Upto1;
66         while Upto2 < Last and then
67               not Is_Text (Ada.Strings.Unbounded.Element (S, Upto2 + 1))
68         loop
69            Upto2 := Upto2 + 1;
70         end loop;
71         Process_Line (Slice (S, From, Upto1));
72         From := Upto2 + 1;
73      end loop;
74   end Process_Lines;
75
76end RW_File;
77