annotate gcc/ada/make_util.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- M A K E _ U T I L --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 2004-2017, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with Atree; use Atree;
kono
parents:
diff changeset
27 with Debug;
kono
parents:
diff changeset
28 with Errutil;
kono
parents:
diff changeset
29 with Osint; use Osint;
kono
parents:
diff changeset
30 with Output; use Output;
kono
parents:
diff changeset
31 with Opt; use Opt;
kono
parents:
diff changeset
32 with Table;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with Ada.Command_Line; use Ada.Command_Line;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 with GNAT.Case_Util; use GNAT.Case_Util;
kono
parents:
diff changeset
37 with GNAT.Directory_Operations; use GNAT.Directory_Operations;
kono
parents:
diff changeset
38 with GNAT.HTable;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 package body Make_Util is
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 ---------
kono
parents:
diff changeset
43 -- Add --
kono
parents:
diff changeset
44 ---------
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 procedure Add
kono
parents:
diff changeset
47 (Option : String_Access;
kono
parents:
diff changeset
48 To : in out String_List_Access;
kono
parents:
diff changeset
49 Last : in out Natural)
kono
parents:
diff changeset
50 is
kono
parents:
diff changeset
51 begin
kono
parents:
diff changeset
52 if Last = To'Last then
kono
parents:
diff changeset
53 declare
kono
parents:
diff changeset
54 New_Options : constant String_List_Access :=
kono
parents:
diff changeset
55 new String_List (1 .. To'Last * 2);
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 begin
kono
parents:
diff changeset
58 New_Options (To'Range) := To.all;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 -- Set all elements of the original options to null to avoid
kono
parents:
diff changeset
61 -- deallocation of copies.
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 To.all := (others => null);
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 Free (To);
kono
parents:
diff changeset
66 To := New_Options;
kono
parents:
diff changeset
67 end;
kono
parents:
diff changeset
68 end if;
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 Last := Last + 1;
kono
parents:
diff changeset
71 To (Last) := Option;
kono
parents:
diff changeset
72 end Add;
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 procedure Add
kono
parents:
diff changeset
75 (Option : String;
kono
parents:
diff changeset
76 To : in out String_List_Access;
kono
parents:
diff changeset
77 Last : in out Natural)
kono
parents:
diff changeset
78 is
kono
parents:
diff changeset
79 begin
kono
parents:
diff changeset
80 Add (Option => new String'(Option), To => To, Last => Last);
kono
parents:
diff changeset
81 end Add;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 -------------------------
kono
parents:
diff changeset
84 -- Base_Name_Index_For --
kono
parents:
diff changeset
85 -------------------------
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 function Base_Name_Index_For
kono
parents:
diff changeset
88 (Main : String;
kono
parents:
diff changeset
89 Main_Index : Int;
kono
parents:
diff changeset
90 Index_Separator : Character) return File_Name_Type
kono
parents:
diff changeset
91 is
kono
parents:
diff changeset
92 Result : File_Name_Type;
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 begin
kono
parents:
diff changeset
95 Name_Len := 0;
kono
parents:
diff changeset
96 Add_Str_To_Name_Buffer (Base_Name (Main));
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 -- Remove the extension, if any, that is the last part of the base name
kono
parents:
diff changeset
99 -- starting with a dot and following some characters.
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 for J in reverse 2 .. Name_Len loop
kono
parents:
diff changeset
102 if Name_Buffer (J) = '.' then
kono
parents:
diff changeset
103 Name_Len := J - 1;
kono
parents:
diff changeset
104 exit;
kono
parents:
diff changeset
105 end if;
kono
parents:
diff changeset
106 end loop;
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 -- Add the index info, if index is different from 0
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 if Main_Index > 0 then
kono
parents:
diff changeset
111 Add_Char_To_Name_Buffer (Index_Separator);
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 declare
kono
parents:
diff changeset
114 Img : constant String := Main_Index'Img;
kono
parents:
diff changeset
115 begin
kono
parents:
diff changeset
116 Add_Str_To_Name_Buffer (Img (2 .. Img'Last));
kono
parents:
diff changeset
117 end;
kono
parents:
diff changeset
118 end if;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 Result := Name_Find;
kono
parents:
diff changeset
121 return Result;
kono
parents:
diff changeset
122 end Base_Name_Index_For;
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 -----------------
kono
parents:
diff changeset
125 -- Create_Name --
kono
parents:
diff changeset
126 -----------------
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 function Create_Name (Name : String) return File_Name_Type is
kono
parents:
diff changeset
129 begin
kono
parents:
diff changeset
130 Name_Len := 0;
kono
parents:
diff changeset
131 Add_Str_To_Name_Buffer (Name);
kono
parents:
diff changeset
132 return Name_Find;
kono
parents:
diff changeset
133 end Create_Name;
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 function Create_Name (Name : String) return Name_Id is
kono
parents:
diff changeset
136 begin
kono
parents:
diff changeset
137 Name_Len := 0;
kono
parents:
diff changeset
138 Add_Str_To_Name_Buffer (Name);
kono
parents:
diff changeset
139 return Name_Find;
kono
parents:
diff changeset
140 end Create_Name;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 function Create_Name (Name : String) return Path_Name_Type is
kono
parents:
diff changeset
143 begin
kono
parents:
diff changeset
144 Name_Len := 0;
kono
parents:
diff changeset
145 Add_Str_To_Name_Buffer (Name);
kono
parents:
diff changeset
146 return Name_Find;
kono
parents:
diff changeset
147 end Create_Name;
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 ---------------------------
kono
parents:
diff changeset
150 -- Ensure_Absolute_Path --
kono
parents:
diff changeset
151 ---------------------------
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 procedure Ensure_Absolute_Path
kono
parents:
diff changeset
154 (Switch : in out String_Access;
kono
parents:
diff changeset
155 Parent : String;
kono
parents:
diff changeset
156 Do_Fail : Fail_Proc;
kono
parents:
diff changeset
157 For_Gnatbind : Boolean := False;
kono
parents:
diff changeset
158 Including_Non_Switch : Boolean := True;
kono
parents:
diff changeset
159 Including_RTS : Boolean := False)
kono
parents:
diff changeset
160 is
kono
parents:
diff changeset
161 begin
kono
parents:
diff changeset
162 if Switch /= null then
kono
parents:
diff changeset
163 declare
kono
parents:
diff changeset
164 Sw : String (1 .. Switch'Length);
kono
parents:
diff changeset
165 Start : Positive;
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 begin
kono
parents:
diff changeset
168 Sw := Switch.all;
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 if Sw (1) = '-' then
kono
parents:
diff changeset
171 if Sw'Length >= 3
kono
parents:
diff changeset
172 and then (Sw (2) = 'I'
kono
parents:
diff changeset
173 or else (not For_Gnatbind
kono
parents:
diff changeset
174 and then (Sw (2) = 'L'
kono
parents:
diff changeset
175 or else
kono
parents:
diff changeset
176 Sw (2) = 'A')))
kono
parents:
diff changeset
177 then
kono
parents:
diff changeset
178 Start := 3;
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 if Sw = "-I-" then
kono
parents:
diff changeset
181 return;
kono
parents:
diff changeset
182 end if;
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 elsif Sw'Length >= 4
kono
parents:
diff changeset
185 and then
kono
parents:
diff changeset
186 (Sw (2 .. 3) = "aL" or else
kono
parents:
diff changeset
187 Sw (2 .. 3) = "aO" or else
kono
parents:
diff changeset
188 Sw (2 .. 3) = "aI"
kono
parents:
diff changeset
189 or else (For_Gnatbind and then Sw (2 .. 3) = "A="))
kono
parents:
diff changeset
190 then
kono
parents:
diff changeset
191 Start := 4;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 elsif Including_RTS
kono
parents:
diff changeset
194 and then Sw'Length >= 7
kono
parents:
diff changeset
195 and then Sw (2 .. 6) = "-RTS="
kono
parents:
diff changeset
196 then
kono
parents:
diff changeset
197 Start := 7;
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 else
kono
parents:
diff changeset
200 return;
kono
parents:
diff changeset
201 end if;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 -- Because relative path arguments to --RTS= may be relative to
kono
parents:
diff changeset
204 -- the search directory prefix, those relative path arguments
kono
parents:
diff changeset
205 -- are converted only when they include directory information.
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 if not Is_Absolute_Path (Sw (Start .. Sw'Last)) then
kono
parents:
diff changeset
208 if Parent'Length = 0 then
kono
parents:
diff changeset
209 Do_Fail
kono
parents:
diff changeset
210 ("relative search path switches ("""
kono
parents:
diff changeset
211 & Sw
kono
parents:
diff changeset
212 & """) are not allowed");
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 elsif Including_RTS then
kono
parents:
diff changeset
215 for J in Start .. Sw'Last loop
kono
parents:
diff changeset
216 if Sw (J) = Directory_Separator then
kono
parents:
diff changeset
217 Switch :=
kono
parents:
diff changeset
218 new String'
kono
parents:
diff changeset
219 (Sw (1 .. Start - 1)
kono
parents:
diff changeset
220 & Parent
kono
parents:
diff changeset
221 & Directory_Separator
kono
parents:
diff changeset
222 & Sw (Start .. Sw'Last));
kono
parents:
diff changeset
223 return;
kono
parents:
diff changeset
224 end if;
kono
parents:
diff changeset
225 end loop;
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 else
kono
parents:
diff changeset
228 Switch :=
kono
parents:
diff changeset
229 new String'
kono
parents:
diff changeset
230 (Sw (1 .. Start - 1)
kono
parents:
diff changeset
231 & Parent
kono
parents:
diff changeset
232 & Directory_Separator
kono
parents:
diff changeset
233 & Sw (Start .. Sw'Last));
kono
parents:
diff changeset
234 end if;
kono
parents:
diff changeset
235 end if;
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 elsif Including_Non_Switch then
kono
parents:
diff changeset
238 if not Is_Absolute_Path (Sw) then
kono
parents:
diff changeset
239 if Parent'Length = 0 then
kono
parents:
diff changeset
240 Do_Fail
kono
parents:
diff changeset
241 ("relative paths (""" & Sw & """) are not allowed");
kono
parents:
diff changeset
242 else
kono
parents:
diff changeset
243 Switch := new String'(Parent & Directory_Separator & Sw);
kono
parents:
diff changeset
244 end if;
kono
parents:
diff changeset
245 end if;
kono
parents:
diff changeset
246 end if;
kono
parents:
diff changeset
247 end;
kono
parents:
diff changeset
248 end if;
kono
parents:
diff changeset
249 end Ensure_Absolute_Path;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 ----------------------------
kono
parents:
diff changeset
252 -- Executable_Prefix_Path --
kono
parents:
diff changeset
253 ----------------------------
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 function Executable_Prefix_Path return String is
kono
parents:
diff changeset
256 Exec_Name : constant String := Command_Name;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 function Get_Install_Dir (S : String) return String;
kono
parents:
diff changeset
259 -- S is the executable name preceded by the absolute or relative path,
kono
parents:
diff changeset
260 -- e.g. "c:\usr\bin\gcc.exe". Returns the absolute directory where "bin"
kono
parents:
diff changeset
261 -- lies (in the example "C:\usr"). If the executable is not in a "bin"
kono
parents:
diff changeset
262 -- directory, return "".
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 ---------------------
kono
parents:
diff changeset
265 -- Get_Install_Dir --
kono
parents:
diff changeset
266 ---------------------
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 function Get_Install_Dir (S : String) return String is
kono
parents:
diff changeset
269 Exec : String := S;
kono
parents:
diff changeset
270 Path_Last : Integer := 0;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 begin
kono
parents:
diff changeset
273 for J in reverse Exec'Range loop
kono
parents:
diff changeset
274 if Exec (J) = Directory_Separator then
kono
parents:
diff changeset
275 Path_Last := J - 1;
kono
parents:
diff changeset
276 exit;
kono
parents:
diff changeset
277 end if;
kono
parents:
diff changeset
278 end loop;
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 if Path_Last >= Exec'First + 2 then
kono
parents:
diff changeset
281 To_Lower (Exec (Path_Last - 2 .. Path_Last));
kono
parents:
diff changeset
282 end if;
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 if Path_Last < Exec'First + 2
kono
parents:
diff changeset
285 or else Exec (Path_Last - 2 .. Path_Last) /= "bin"
kono
parents:
diff changeset
286 or else (Path_Last - 3 >= Exec'First
kono
parents:
diff changeset
287 and then Exec (Path_Last - 3) /= Directory_Separator)
kono
parents:
diff changeset
288 then
kono
parents:
diff changeset
289 return "";
kono
parents:
diff changeset
290 end if;
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 return Normalize_Pathname
kono
parents:
diff changeset
293 (Exec (Exec'First .. Path_Last - 4),
kono
parents:
diff changeset
294 Resolve_Links => Opt.Follow_Links_For_Dirs)
kono
parents:
diff changeset
295 & Directory_Separator;
kono
parents:
diff changeset
296 end Get_Install_Dir;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 -- Beginning of Executable_Prefix_Path
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 begin
kono
parents:
diff changeset
301 -- First determine if a path prefix was placed in front of the
kono
parents:
diff changeset
302 -- executable name.
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 for J in reverse Exec_Name'Range loop
kono
parents:
diff changeset
305 if Exec_Name (J) = Directory_Separator then
kono
parents:
diff changeset
306 return Get_Install_Dir (Exec_Name);
kono
parents:
diff changeset
307 end if;
kono
parents:
diff changeset
308 end loop;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 -- If we get here, the user has typed the executable name with no
kono
parents:
diff changeset
311 -- directory prefix.
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 declare
kono
parents:
diff changeset
314 Path : String_Access := Locate_Exec_On_Path (Exec_Name);
kono
parents:
diff changeset
315 begin
kono
parents:
diff changeset
316 if Path = null then
kono
parents:
diff changeset
317 return "";
kono
parents:
diff changeset
318 else
kono
parents:
diff changeset
319 declare
kono
parents:
diff changeset
320 Dir : constant String := Get_Install_Dir (Path.all);
kono
parents:
diff changeset
321 begin
kono
parents:
diff changeset
322 Free (Path);
kono
parents:
diff changeset
323 return Dir;
kono
parents:
diff changeset
324 end;
kono
parents:
diff changeset
325 end if;
kono
parents:
diff changeset
326 end;
kono
parents:
diff changeset
327 end Executable_Prefix_Path;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 ------------------
kono
parents:
diff changeset
330 -- Fail_Program --
kono
parents:
diff changeset
331 ------------------
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 procedure Fail_Program
kono
parents:
diff changeset
334 (S : String;
kono
parents:
diff changeset
335 Flush_Messages : Boolean := True)
kono
parents:
diff changeset
336 is
kono
parents:
diff changeset
337 begin
kono
parents:
diff changeset
338 if Flush_Messages and not No_Exit_Message then
kono
parents:
diff changeset
339 if Total_Errors_Detected /= 0 or else Warnings_Detected /= 0 then
kono
parents:
diff changeset
340 Errutil.Finalize;
kono
parents:
diff changeset
341 end if;
kono
parents:
diff changeset
342 end if;
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 Finish_Program (E_Fatal, S => S);
kono
parents:
diff changeset
345 end Fail_Program;
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 --------------------
kono
parents:
diff changeset
348 -- Finish_Program --
kono
parents:
diff changeset
349 --------------------
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 procedure Finish_Program
kono
parents:
diff changeset
352 (Exit_Code : Osint.Exit_Code_Type := Osint.E_Success;
kono
parents:
diff changeset
353 S : String := "")
kono
parents:
diff changeset
354 is
kono
parents:
diff changeset
355 begin
kono
parents:
diff changeset
356 if S'Length > 0 then
kono
parents:
diff changeset
357 if Exit_Code /= E_Success then
kono
parents:
diff changeset
358 if No_Exit_Message then
kono
parents:
diff changeset
359 Osint.Exit_Program (E_Fatal);
kono
parents:
diff changeset
360 else
kono
parents:
diff changeset
361 Osint.Fail (S);
kono
parents:
diff changeset
362 end if;
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 elsif not No_Exit_Message then
kono
parents:
diff changeset
365 Write_Str (S);
kono
parents:
diff changeset
366 end if;
kono
parents:
diff changeset
367 end if;
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 -- Output Namet statistics
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 Namet.Finalize;
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 Exit_Program (Exit_Code);
kono
parents:
diff changeset
374 end Finish_Program;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 ----------
kono
parents:
diff changeset
377 -- Hash --
kono
parents:
diff changeset
378 ----------
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 function Hash is new GNAT.HTable.Hash (Header_Num => Header_Num);
kono
parents:
diff changeset
381 -- Used in implementation of other functions Hash below
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 ----------
kono
parents:
diff changeset
384 -- Hash --
kono
parents:
diff changeset
385 ----------
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 function Hash (Name : File_Name_Type) return Header_Num is
kono
parents:
diff changeset
388 begin
kono
parents:
diff changeset
389 return Hash (Get_Name_String (Name));
kono
parents:
diff changeset
390 end Hash;
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 function Hash (Name : Name_Id) return Header_Num is
kono
parents:
diff changeset
393 begin
kono
parents:
diff changeset
394 return Hash (Get_Name_String (Name));
kono
parents:
diff changeset
395 end Hash;
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 function Hash (Name : Path_Name_Type) return Header_Num is
kono
parents:
diff changeset
398 begin
kono
parents:
diff changeset
399 return Hash (Get_Name_String (Name));
kono
parents:
diff changeset
400 end Hash;
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 ------------
kono
parents:
diff changeset
403 -- Inform --
kono
parents:
diff changeset
404 ------------
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 procedure Inform (N : File_Name_Type; Msg : String) is
kono
parents:
diff changeset
407 begin
kono
parents:
diff changeset
408 Inform (Name_Id (N), Msg);
kono
parents:
diff changeset
409 end Inform;
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 procedure Inform (N : Name_Id := No_Name; Msg : String) is
kono
parents:
diff changeset
412 begin
kono
parents:
diff changeset
413 Osint.Write_Program_Name;
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 Write_Str (": ");
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 if N /= No_Name then
kono
parents:
diff changeset
418 Write_Str ("""");
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 declare
kono
parents:
diff changeset
421 Name : constant String := Get_Name_String (N);
kono
parents:
diff changeset
422 begin
kono
parents:
diff changeset
423 if Debug.Debug_Flag_F and then Is_Absolute_Path (Name) then
kono
parents:
diff changeset
424 Write_Str (File_Name (Name));
kono
parents:
diff changeset
425 else
kono
parents:
diff changeset
426 Write_Str (Name);
kono
parents:
diff changeset
427 end if;
kono
parents:
diff changeset
428 end;
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 Write_Str (""" ");
kono
parents:
diff changeset
431 end if;
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 Write_Str (Msg);
kono
parents:
diff changeset
434 Write_Eol;
kono
parents:
diff changeset
435 end Inform;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 -----------
kono
parents:
diff changeset
438 -- Mains --
kono
parents:
diff changeset
439 -----------
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 package body Mains is
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 package Names is new Table.Table
kono
parents:
diff changeset
444 (Table_Component_Type => Main_Info,
kono
parents:
diff changeset
445 Table_Index_Type => Integer,
kono
parents:
diff changeset
446 Table_Low_Bound => 1,
kono
parents:
diff changeset
447 Table_Initial => 10,
kono
parents:
diff changeset
448 Table_Increment => 100,
kono
parents:
diff changeset
449 Table_Name => "Makeutl.Mains.Names");
kono
parents:
diff changeset
450 -- The table that stores the mains
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 Current : Natural := 0;
kono
parents:
diff changeset
453 -- The index of the last main retrieved from the table
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 Count_Of_Mains_With_No_Tree : Natural := 0;
kono
parents:
diff changeset
456 -- Number of main units for which we do not know the project tree
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 --------------
kono
parents:
diff changeset
459 -- Add_Main --
kono
parents:
diff changeset
460 --------------
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 procedure Add_Main (Name : String; Index : Int := 0) is
kono
parents:
diff changeset
463 begin
kono
parents:
diff changeset
464 Name_Len := 0;
kono
parents:
diff changeset
465 Add_Str_To_Name_Buffer (Name);
kono
parents:
diff changeset
466 Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 Names.Increment_Last;
kono
parents:
diff changeset
469 Names.Table (Names.Last) := (Name_Find, Index);
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 Mains.Count_Of_Mains_With_No_Tree :=
kono
parents:
diff changeset
472 Mains.Count_Of_Mains_With_No_Tree + 1;
kono
parents:
diff changeset
473 end Add_Main;
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 ------------
kono
parents:
diff changeset
476 -- Delete --
kono
parents:
diff changeset
477 ------------
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 procedure Delete is
kono
parents:
diff changeset
480 begin
kono
parents:
diff changeset
481 Names.Set_Last (0);
kono
parents:
diff changeset
482 Mains.Reset;
kono
parents:
diff changeset
483 end Delete;
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 ---------------
kono
parents:
diff changeset
486 -- Next_Main --
kono
parents:
diff changeset
487 ---------------
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 function Next_Main return String is
kono
parents:
diff changeset
490 Info : constant Main_Info := Next_Main;
kono
parents:
diff changeset
491 begin
kono
parents:
diff changeset
492 if Info = No_Main_Info then
kono
parents:
diff changeset
493 return "";
kono
parents:
diff changeset
494 else
kono
parents:
diff changeset
495 return Get_Name_String (Info.File);
kono
parents:
diff changeset
496 end if;
kono
parents:
diff changeset
497 end Next_Main;
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 function Next_Main return Main_Info is
kono
parents:
diff changeset
500 begin
kono
parents:
diff changeset
501 if Current >= Names.Last then
kono
parents:
diff changeset
502 return No_Main_Info;
kono
parents:
diff changeset
503 else
kono
parents:
diff changeset
504 Current := Current + 1;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 declare
kono
parents:
diff changeset
507 Orig_Main : constant File_Name_Type :=
kono
parents:
diff changeset
508 Names.Table (Current).File;
kono
parents:
diff changeset
509 Current_Main : File_Name_Type;
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 begin
kono
parents:
diff changeset
512 if Strip_Suffix (Orig_Main) = Orig_Main then
kono
parents:
diff changeset
513 Get_Name_String (Orig_Main);
kono
parents:
diff changeset
514 Add_Str_To_Name_Buffer (".adb");
kono
parents:
diff changeset
515 Current_Main := Name_Find;
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 if Full_Source_Name (Current_Main) = No_File then
kono
parents:
diff changeset
518 Get_Name_String (Orig_Main);
kono
parents:
diff changeset
519 Add_Str_To_Name_Buffer (".ads");
kono
parents:
diff changeset
520 Current_Main := Name_Find;
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 if Full_Source_Name (Current_Main) /= No_File then
kono
parents:
diff changeset
523 Names.Table (Current).File := Current_Main;
kono
parents:
diff changeset
524 end if;
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 else
kono
parents:
diff changeset
527 Names.Table (Current).File := Current_Main;
kono
parents:
diff changeset
528 end if;
kono
parents:
diff changeset
529 end if;
kono
parents:
diff changeset
530 end;
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 return Names.Table (Current);
kono
parents:
diff changeset
533 end if;
kono
parents:
diff changeset
534 end Next_Main;
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 ---------------------
kono
parents:
diff changeset
537 -- Number_Of_Mains --
kono
parents:
diff changeset
538 ---------------------
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 function Number_Of_Mains return Natural is
kono
parents:
diff changeset
541 begin
kono
parents:
diff changeset
542 return Names.Last;
kono
parents:
diff changeset
543 end Number_Of_Mains;
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 -----------
kono
parents:
diff changeset
546 -- Reset --
kono
parents:
diff changeset
547 -----------
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 procedure Reset is
kono
parents:
diff changeset
550 begin
kono
parents:
diff changeset
551 Current := 0;
kono
parents:
diff changeset
552 end Reset;
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 --------------------------
kono
parents:
diff changeset
555 -- Set_Multi_Unit_Index --
kono
parents:
diff changeset
556 --------------------------
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 procedure Set_Multi_Unit_Index
kono
parents:
diff changeset
559 (Index : Int := 0)
kono
parents:
diff changeset
560 is
kono
parents:
diff changeset
561 begin
kono
parents:
diff changeset
562 if Index /= 0 then
kono
parents:
diff changeset
563 if Names.Last = 0 then
kono
parents:
diff changeset
564 Fail_Program
kono
parents:
diff changeset
565 ("cannot specify a multi-unit index but no main "
kono
parents:
diff changeset
566 & "on the command line");
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 elsif Names.Last > 1 then
kono
parents:
diff changeset
569 Fail_Program
kono
parents:
diff changeset
570 ("cannot specify several mains with a multi-unit index");
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 else
kono
parents:
diff changeset
573 Names.Table (Names.Last).Index := Index;
kono
parents:
diff changeset
574 end if;
kono
parents:
diff changeset
575 end if;
kono
parents:
diff changeset
576 end Set_Multi_Unit_Index;
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 end Mains;
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 -----------------------
kono
parents:
diff changeset
581 -- Path_Or_File_Name --
kono
parents:
diff changeset
582 -----------------------
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 function Path_Or_File_Name (Path : Path_Name_Type) return String is
kono
parents:
diff changeset
585 Path_Name : constant String := Get_Name_String (Path);
kono
parents:
diff changeset
586 begin
kono
parents:
diff changeset
587 if Debug.Debug_Flag_F then
kono
parents:
diff changeset
588 return File_Name (Path_Name);
kono
parents:
diff changeset
589 else
kono
parents:
diff changeset
590 return Path_Name;
kono
parents:
diff changeset
591 end if;
kono
parents:
diff changeset
592 end Path_Or_File_Name;
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 -------------------
kono
parents:
diff changeset
595 -- Unit_Index_Of --
kono
parents:
diff changeset
596 -------------------
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 function Unit_Index_Of (ALI_File : File_Name_Type) return Int is
kono
parents:
diff changeset
599 Start : Natural;
kono
parents:
diff changeset
600 Finish : Natural;
kono
parents:
diff changeset
601 Result : Int := 0;
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 begin
kono
parents:
diff changeset
604 Get_Name_String (ALI_File);
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 -- First, find the last dot
kono
parents:
diff changeset
607
kono
parents:
diff changeset
608 Finish := Name_Len;
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 while Finish >= 1 and then Name_Buffer (Finish) /= '.' loop
kono
parents:
diff changeset
611 Finish := Finish - 1;
kono
parents:
diff changeset
612 end loop;
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 if Finish = 1 then
kono
parents:
diff changeset
615 return 0;
kono
parents:
diff changeset
616 end if;
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 -- Now check that the dot is preceded by digits
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 Start := Finish;
kono
parents:
diff changeset
621 Finish := Finish - 1;
kono
parents:
diff changeset
622 while Start >= 1 and then Name_Buffer (Start - 1) in '0' .. '9' loop
kono
parents:
diff changeset
623 Start := Start - 1;
kono
parents:
diff changeset
624 end loop;
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 -- If there are no digits, or if the digits are not preceded by the
kono
parents:
diff changeset
627 -- character that precedes a unit index, this is not the ALI file of
kono
parents:
diff changeset
628 -- a unit in a multi-unit source.
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 if Start > Finish
kono
parents:
diff changeset
631 or else Start = 1
kono
parents:
diff changeset
632 or else Name_Buffer (Start - 1) /= Multi_Unit_Index_Character
kono
parents:
diff changeset
633 then
kono
parents:
diff changeset
634 return 0;
kono
parents:
diff changeset
635 end if;
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 -- Build the index from the digit(s)
kono
parents:
diff changeset
638
kono
parents:
diff changeset
639 while Start <= Finish loop
kono
parents:
diff changeset
640 Result := Result * 10 +
kono
parents:
diff changeset
641 Character'Pos (Name_Buffer (Start)) - Character'Pos ('0');
kono
parents:
diff changeset
642 Start := Start + 1;
kono
parents:
diff changeset
643 end loop;
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 return Result;
kono
parents:
diff changeset
646 end Unit_Index_Of;
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648 -----------------
kono
parents:
diff changeset
649 -- Verbose_Msg --
kono
parents:
diff changeset
650 -----------------
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 procedure Verbose_Msg
kono
parents:
diff changeset
653 (N1 : Name_Id;
kono
parents:
diff changeset
654 S1 : String;
kono
parents:
diff changeset
655 N2 : Name_Id := No_Name;
kono
parents:
diff changeset
656 S2 : String := "";
kono
parents:
diff changeset
657 Prefix : String := " -> ";
kono
parents:
diff changeset
658 Minimum_Verbosity : Opt.Verbosity_Level_Type := Opt.Low)
kono
parents:
diff changeset
659 is
kono
parents:
diff changeset
660 begin
kono
parents:
diff changeset
661 if not Opt.Verbose_Mode
kono
parents:
diff changeset
662 or else Minimum_Verbosity > Opt.Verbosity_Level
kono
parents:
diff changeset
663 then
kono
parents:
diff changeset
664 return;
kono
parents:
diff changeset
665 end if;
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 Write_Str (Prefix);
kono
parents:
diff changeset
668 Write_Str ("""");
kono
parents:
diff changeset
669 Write_Name (N1);
kono
parents:
diff changeset
670 Write_Str (""" ");
kono
parents:
diff changeset
671 Write_Str (S1);
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 if N2 /= No_Name then
kono
parents:
diff changeset
674 Write_Str (" """);
kono
parents:
diff changeset
675 Write_Name (N2);
kono
parents:
diff changeset
676 Write_Str (""" ");
kono
parents:
diff changeset
677 end if;
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 Write_Str (S2);
kono
parents:
diff changeset
680 Write_Eol;
kono
parents:
diff changeset
681 end Verbose_Msg;
kono
parents:
diff changeset
682
kono
parents:
diff changeset
683 procedure Verbose_Msg
kono
parents:
diff changeset
684 (N1 : File_Name_Type;
kono
parents:
diff changeset
685 S1 : String;
kono
parents:
diff changeset
686 N2 : File_Name_Type := No_File;
kono
parents:
diff changeset
687 S2 : String := "";
kono
parents:
diff changeset
688 Prefix : String := " -> ";
kono
parents:
diff changeset
689 Minimum_Verbosity : Opt.Verbosity_Level_Type := Opt.Low)
kono
parents:
diff changeset
690 is
kono
parents:
diff changeset
691 begin
kono
parents:
diff changeset
692 Verbose_Msg
kono
parents:
diff changeset
693 (Name_Id (N1), S1, Name_Id (N2), S2, Prefix, Minimum_Verbosity);
kono
parents:
diff changeset
694 end Verbose_Msg;
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 -----------
kono
parents:
diff changeset
697 -- Queue --
kono
parents:
diff changeset
698 -----------
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 package body Queue is
kono
parents:
diff changeset
701
kono
parents:
diff changeset
702 type Q_Record is record
kono
parents:
diff changeset
703 Info : Source_Info;
kono
parents:
diff changeset
704 Processed : Boolean;
kono
parents:
diff changeset
705 end record;
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 package Q is new Table.Table
kono
parents:
diff changeset
708 (Table_Component_Type => Q_Record,
kono
parents:
diff changeset
709 Table_Index_Type => Natural,
kono
parents:
diff changeset
710 Table_Low_Bound => 1,
kono
parents:
diff changeset
711 Table_Initial => 1000,
kono
parents:
diff changeset
712 Table_Increment => 100,
kono
parents:
diff changeset
713 Table_Name => "Makeutl.Queue.Q");
kono
parents:
diff changeset
714 -- This is the actual Queue
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 type Mark_Key is record
kono
parents:
diff changeset
717 File : File_Name_Type;
kono
parents:
diff changeset
718 Index : Int;
kono
parents:
diff changeset
719 end record;
kono
parents:
diff changeset
720 -- Identify either a mono-unit source (when Index = 0) or a specific
kono
parents:
diff changeset
721 -- unit (index = 1's origin index of unit) in a multi-unit source.
kono
parents:
diff changeset
722
kono
parents:
diff changeset
723 Max_Mask_Num : constant := 2048;
kono
parents:
diff changeset
724 subtype Mark_Num is Union_Id range 0 .. Max_Mask_Num - 1;
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 function Hash (Key : Mark_Key) return Mark_Num;
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 package Marks is new GNAT.HTable.Simple_HTable
kono
parents:
diff changeset
729 (Header_Num => Mark_Num,
kono
parents:
diff changeset
730 Element => Boolean,
kono
parents:
diff changeset
731 No_Element => False,
kono
parents:
diff changeset
732 Key => Mark_Key,
kono
parents:
diff changeset
733 Hash => Hash,
kono
parents:
diff changeset
734 Equal => "=");
kono
parents:
diff changeset
735 -- A hash table to keep tracks of the marked units.
kono
parents:
diff changeset
736 -- These are the units that have already been processed, when using the
kono
parents:
diff changeset
737 -- gnatmake format. When using the gprbuild format, we can directly
kono
parents:
diff changeset
738 -- store in the source_id whether the file has already been processed.
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 procedure Mark (Source_File : File_Name_Type; Index : Int := 0);
kono
parents:
diff changeset
741 -- Mark a unit, identified by its source file and, when Index is not 0,
kono
parents:
diff changeset
742 -- the index of the unit in the source file. Marking is used to signal
kono
parents:
diff changeset
743 -- that the unit has already been inserted in the Q.
kono
parents:
diff changeset
744
kono
parents:
diff changeset
745 function Is_Marked
kono
parents:
diff changeset
746 (Source_File : File_Name_Type;
kono
parents:
diff changeset
747 Index : Int := 0) return Boolean;
kono
parents:
diff changeset
748 -- Returns True if the unit was previously marked
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 Q_Processed : Natural := 0;
kono
parents:
diff changeset
751 Q_Initialized : Boolean := False;
kono
parents:
diff changeset
752
kono
parents:
diff changeset
753 Q_First : Natural := 1;
kono
parents:
diff changeset
754 -- Points to the first valid element in the queue
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756 procedure Debug_Display (S : Source_Info);
kono
parents:
diff changeset
757 -- A debug display for S
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 function Was_Processed (S : Source_Info) return Boolean;
kono
parents:
diff changeset
760 -- Whether S has already been processed. This marks the source as
kono
parents:
diff changeset
761 -- processed, if it hasn't already been processed.
kono
parents:
diff changeset
762
kono
parents:
diff changeset
763 -------------------
kono
parents:
diff changeset
764 -- Was_Processed --
kono
parents:
diff changeset
765 -------------------
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767 function Was_Processed (S : Source_Info) return Boolean is
kono
parents:
diff changeset
768 begin
kono
parents:
diff changeset
769 if Is_Marked (S.File, S.Index) then
kono
parents:
diff changeset
770 return True;
kono
parents:
diff changeset
771 end if;
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 Mark (S.File, Index => S.Index);
kono
parents:
diff changeset
774
kono
parents:
diff changeset
775 return False;
kono
parents:
diff changeset
776 end Was_Processed;
kono
parents:
diff changeset
777
kono
parents:
diff changeset
778 -------------------
kono
parents:
diff changeset
779 -- Debug_Display --
kono
parents:
diff changeset
780 -------------------
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 procedure Debug_Display (S : Source_Info) is
kono
parents:
diff changeset
783 begin
kono
parents:
diff changeset
784 Write_Name (S.File);
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 if S.Index /= 0 then
kono
parents:
diff changeset
787 Write_Str (", ");
kono
parents:
diff changeset
788 Write_Int (S.Index);
kono
parents:
diff changeset
789 end if;
kono
parents:
diff changeset
790 end Debug_Display;
kono
parents:
diff changeset
791
kono
parents:
diff changeset
792 ----------
kono
parents:
diff changeset
793 -- Hash --
kono
parents:
diff changeset
794 ----------
kono
parents:
diff changeset
795
kono
parents:
diff changeset
796 function Hash (Key : Mark_Key) return Mark_Num is
kono
parents:
diff changeset
797 begin
kono
parents:
diff changeset
798 return Union_Id (Key.File) mod Max_Mask_Num;
kono
parents:
diff changeset
799 end Hash;
kono
parents:
diff changeset
800
kono
parents:
diff changeset
801 ---------------
kono
parents:
diff changeset
802 -- Is_Marked --
kono
parents:
diff changeset
803 ---------------
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 function Is_Marked
kono
parents:
diff changeset
806 (Source_File : File_Name_Type;
kono
parents:
diff changeset
807 Index : Int := 0) return Boolean
kono
parents:
diff changeset
808 is
kono
parents:
diff changeset
809 begin
kono
parents:
diff changeset
810 return Marks.Get (K => (File => Source_File, Index => Index));
kono
parents:
diff changeset
811 end Is_Marked;
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813 ----------
kono
parents:
diff changeset
814 -- Mark --
kono
parents:
diff changeset
815 ----------
kono
parents:
diff changeset
816
kono
parents:
diff changeset
817 procedure Mark (Source_File : File_Name_Type; Index : Int := 0) is
kono
parents:
diff changeset
818 begin
kono
parents:
diff changeset
819 Marks.Set (K => (File => Source_File, Index => Index), E => True);
kono
parents:
diff changeset
820 end Mark;
kono
parents:
diff changeset
821
kono
parents:
diff changeset
822 -------------
kono
parents:
diff changeset
823 -- Extract --
kono
parents:
diff changeset
824 -------------
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 procedure Extract
kono
parents:
diff changeset
827 (Found : out Boolean;
kono
parents:
diff changeset
828 Source : out Source_Info)
kono
parents:
diff changeset
829 is
kono
parents:
diff changeset
830 begin
kono
parents:
diff changeset
831 Found := False;
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 if Q_First <= Q.Last then
kono
parents:
diff changeset
834 Source := Q.Table (Q_First).Info;
kono
parents:
diff changeset
835 Q.Table (Q_First).Processed := True;
kono
parents:
diff changeset
836 Q_First := Q_First + 1;
kono
parents:
diff changeset
837 Found := True;
kono
parents:
diff changeset
838 end if;
kono
parents:
diff changeset
839
kono
parents:
diff changeset
840 if Found then
kono
parents:
diff changeset
841 Q_Processed := Q_Processed + 1;
kono
parents:
diff changeset
842 end if;
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 if Found and then Debug.Debug_Flag_Q then
kono
parents:
diff changeset
845 Write_Str (" Q := Q - [ ");
kono
parents:
diff changeset
846 Debug_Display (Source);
kono
parents:
diff changeset
847 Write_Str (" ]");
kono
parents:
diff changeset
848 Write_Eol;
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 Write_Str (" Q_First =");
kono
parents:
diff changeset
851 Write_Int (Int (Q_First));
kono
parents:
diff changeset
852 Write_Eol;
kono
parents:
diff changeset
853
kono
parents:
diff changeset
854 Write_Str (" Q.Last =");
kono
parents:
diff changeset
855 Write_Int (Int (Q.Last));
kono
parents:
diff changeset
856 Write_Eol;
kono
parents:
diff changeset
857 end if;
kono
parents:
diff changeset
858 end Extract;
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 ---------------
kono
parents:
diff changeset
861 -- Processed --
kono
parents:
diff changeset
862 ---------------
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864 function Processed return Natural is
kono
parents:
diff changeset
865 begin
kono
parents:
diff changeset
866 return Q_Processed;
kono
parents:
diff changeset
867 end Processed;
kono
parents:
diff changeset
868
kono
parents:
diff changeset
869 ----------------
kono
parents:
diff changeset
870 -- Initialize --
kono
parents:
diff changeset
871 ----------------
kono
parents:
diff changeset
872
kono
parents:
diff changeset
873 procedure Initialize (Force : Boolean := False) is
kono
parents:
diff changeset
874 begin
kono
parents:
diff changeset
875 if Force or else not Q_Initialized then
kono
parents:
diff changeset
876 Q_Initialized := True;
kono
parents:
diff changeset
877 Q.Init;
kono
parents:
diff changeset
878 Q_Processed := 0;
kono
parents:
diff changeset
879 Q_First := 1;
kono
parents:
diff changeset
880 end if;
kono
parents:
diff changeset
881 end Initialize;
kono
parents:
diff changeset
882
kono
parents:
diff changeset
883 ------------
kono
parents:
diff changeset
884 -- Insert --
kono
parents:
diff changeset
885 ------------
kono
parents:
diff changeset
886
kono
parents:
diff changeset
887 function Insert (Source : Source_Info) return Boolean is
kono
parents:
diff changeset
888 begin
kono
parents:
diff changeset
889 -- Only insert in the Q if it is not already done, to avoid
kono
parents:
diff changeset
890 -- simultaneous compilations if -jnnn is used.
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 if Was_Processed (Source) then
kono
parents:
diff changeset
893 return False;
kono
parents:
diff changeset
894 end if;
kono
parents:
diff changeset
895
kono
parents:
diff changeset
896 Q.Append (New_Val => (Info => Source, Processed => False));
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 if Debug.Debug_Flag_Q then
kono
parents:
diff changeset
899 Write_Str (" Q := Q + [ ");
kono
parents:
diff changeset
900 Debug_Display (Source);
kono
parents:
diff changeset
901 Write_Str (" ] ");
kono
parents:
diff changeset
902 Write_Eol;
kono
parents:
diff changeset
903
kono
parents:
diff changeset
904 Write_Str (" Q_First =");
kono
parents:
diff changeset
905 Write_Int (Int (Q_First));
kono
parents:
diff changeset
906 Write_Eol;
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 Write_Str (" Q.Last =");
kono
parents:
diff changeset
909 Write_Int (Int (Q.Last));
kono
parents:
diff changeset
910 Write_Eol;
kono
parents:
diff changeset
911 end if;
kono
parents:
diff changeset
912
kono
parents:
diff changeset
913 return True;
kono
parents:
diff changeset
914 end Insert;
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 procedure Insert (Source : Source_Info) is
kono
parents:
diff changeset
917 Discard : Boolean;
kono
parents:
diff changeset
918 begin
kono
parents:
diff changeset
919 Discard := Insert (Source);
kono
parents:
diff changeset
920 end Insert;
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 --------------
kono
parents:
diff changeset
923 -- Is_Empty --
kono
parents:
diff changeset
924 --------------
kono
parents:
diff changeset
925
kono
parents:
diff changeset
926 function Is_Empty return Boolean is
kono
parents:
diff changeset
927 begin
kono
parents:
diff changeset
928 return Q_Processed >= Q.Last;
kono
parents:
diff changeset
929 end Is_Empty;
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 ----------
kono
parents:
diff changeset
932 -- Size --
kono
parents:
diff changeset
933 ----------
kono
parents:
diff changeset
934
kono
parents:
diff changeset
935 function Size return Natural is
kono
parents:
diff changeset
936 begin
kono
parents:
diff changeset
937 return Q.Last;
kono
parents:
diff changeset
938 end Size;
kono
parents:
diff changeset
939
kono
parents:
diff changeset
940 -------------
kono
parents:
diff changeset
941 -- Element --
kono
parents:
diff changeset
942 -------------
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 function Element (Rank : Positive) return File_Name_Type is
kono
parents:
diff changeset
945 begin
kono
parents:
diff changeset
946 if Rank <= Q.Last then
kono
parents:
diff changeset
947 return Q.Table (Rank).Info.File;
kono
parents:
diff changeset
948 else
kono
parents:
diff changeset
949 return No_File;
kono
parents:
diff changeset
950 end if;
kono
parents:
diff changeset
951 end Element;
kono
parents:
diff changeset
952
kono
parents:
diff changeset
953 ------------------
kono
parents:
diff changeset
954 -- Remove_Marks --
kono
parents:
diff changeset
955 ------------------
kono
parents:
diff changeset
956
kono
parents:
diff changeset
957 procedure Remove_Marks is
kono
parents:
diff changeset
958 begin
kono
parents:
diff changeset
959 Marks.Reset;
kono
parents:
diff changeset
960 end Remove_Marks;
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962 end Queue;
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 end Make_Util;