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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 | with Ada.IO_Exceptions;
with Ada.Streams;
with Ada.Strings.Unbounded;
with GNAT.OS_Lib;
with GPR2.Context;
with GPR2.Path_Name;
with GPR2.Project.Tree.View_Builder;
with Interfaces.C;
procedure Main is
type Stdio_Stream is new Ada.Streams.Root_Stream_Type with null record;
-- Stream that reads and writes standard input/output descriptors
overriding procedure Read
(Stream : in out Stdio_Stream;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
overriding procedure Write
(Stream : in out Stdio_Stream;
Item : Ada.Streams.Stream_Element_Array);
package C renames Interfaces.C;
----------
-- Read --
----------
overriding procedure Read
(Stream : in out Stdio_Stream;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset)
is
pragma Unreferenced (Stream);
use type Ada.Streams.Stream_Element_Offset;
function read
(fildes : C.int;
buf : out Ada.Streams.Stream_Element_Array;
nbyte : C.size_t) return C.size_t
with Import => True,
Convention => C,
External_Name => "read";
Done : C.size_t;
begin
Done := read (0, Item, Item'Length);
Last := Item'First + Ada.Streams.Stream_Element_Offset (Done) - 1;
if Last < Item'First then
raise Ada.IO_Exceptions.End_Error with "end of file";
end if;
end Read;
-----------
-- Write --
-----------
overriding procedure Write
(Stream : in out Stdio_Stream;
Item : Ada.Streams.Stream_Element_Array)
is
function write
(fildes : C.int;
buf : Ada.Streams.Stream_Element_Array;
nbyte : C.size_t) return C.size_t
with Import => True,
Convention => C,
External_Name => "write";
pragma Unreferenced (Stream);
Ignore : C.size_t := write (1, Item, Item'Length);
begin
null;
end Write;
-- The input task
task type Input_Task_Type
is
entry Start;
-- Start the task. Should be called once.
end Input_Task_Type;
Buffer_Size : constant := 512;
Vector : Ada.Strings.Unbounded.Unbounded_String;
Buffer : Ada.Streams.Stream_Element_Array (1 .. Buffer_Size);
Last : Ada.Streams.Stream_Element_Count :=
Ada.Streams.Stream_Element_Count
(Ada.Strings.Unbounded.Length (Vector));
Stream : aliased Stdio_Stream;
task body Input_Task_Type is
begin
accept Start;
while True loop
Stream.Read (Buffer, Last);
end loop;
end Input_Task_Type;
Input_Task : Input_Task_Type;
Tree : GPR2.Project.Tree.Object;
Context : GPR2.Context.Object;
Root : constant GPR2.Project.Tree.View_Builder.Object :=
GPR2.Project.Tree.View_Builder.Create
(GPR2.Path_Name.Create_Directory ("demo"), "Custom_Project");
begin
Input_Task.Start;
delay 0.1;
GPR2.Project.Tree.View_Builder.Load_Autoconf (Tree, Root, Context);
if Tree.Log_Messages.Has_Error then
Tree.Log_Messages.Output_Messages;
end if;
Tree.Unload;
Tree.Load_Autoconf (GPR2.Path_Name.Create_File ("test.gpr"), Context);
if Tree.Log_Messages.Has_Error then
Tree.Log_Messages.Output_Messages;
end if;
GNAT.OS_Lib.OS_Exit (0);
exception
when others =>
if Tree.Log_Messages.Has_Error then
Tree.Log_Messages.Output_Messages;
end if;
end Main;
|