annotate gcc/ada/fmap.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
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 -- F M A P --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2001-2018, Free Software Foundation, Inc. --
111
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 Opt; use Opt;
kono
parents:
diff changeset
27 with Osint; use Osint;
kono
parents:
diff changeset
28 with Output; use Output;
kono
parents:
diff changeset
29 with Table;
kono
parents:
diff changeset
30 with Types; use Types;
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 pragma Warnings (Off);
kono
parents:
diff changeset
33 -- This package is used also by gnatcoll
kono
parents:
diff changeset
34 with System.OS_Lib; use System.OS_Lib;
kono
parents:
diff changeset
35 pragma Warnings (On);
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 with Unchecked_Conversion;
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 with GNAT.HTable;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 package body Fmap is
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 No_Mapping_File : Boolean := False;
kono
parents:
diff changeset
44 -- Set to True when the specified mapping file cannot be read in
kono
parents:
diff changeset
45 -- procedure Initialize, so that no attempt is made to open the mapping
kono
parents:
diff changeset
46 -- file in procedure Update_Mapping_File.
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 Max_Buffer : constant := 1_500;
kono
parents:
diff changeset
49 Buffer : String (1 .. Max_Buffer);
kono
parents:
diff changeset
50 -- Used to buffer output when writing to a new mapping file
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 Buffer_Last : Natural := 0;
kono
parents:
diff changeset
53 -- Index of last valid character in Buffer
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 type Mapping is record
kono
parents:
diff changeset
56 Uname : Unit_Name_Type;
kono
parents:
diff changeset
57 Fname : File_Name_Type;
kono
parents:
diff changeset
58 end record;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 package File_Mapping is new Table.Table (
kono
parents:
diff changeset
61 Table_Component_Type => Mapping,
kono
parents:
diff changeset
62 Table_Index_Type => Int,
kono
parents:
diff changeset
63 Table_Low_Bound => 0,
kono
parents:
diff changeset
64 Table_Initial => 1_000,
kono
parents:
diff changeset
65 Table_Increment => 1_000,
kono
parents:
diff changeset
66 Table_Name => "Fmap.File_Mapping");
kono
parents:
diff changeset
67 -- Mapping table to map unit names to file names
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 package Path_Mapping is new Table.Table (
kono
parents:
diff changeset
70 Table_Component_Type => Mapping,
kono
parents:
diff changeset
71 Table_Index_Type => Int,
kono
parents:
diff changeset
72 Table_Low_Bound => 0,
kono
parents:
diff changeset
73 Table_Initial => 1_000,
kono
parents:
diff changeset
74 Table_Increment => 1_000,
kono
parents:
diff changeset
75 Table_Name => "Fmap.Path_Mapping");
kono
parents:
diff changeset
76 -- Mapping table to map file names to path names
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 type Header_Num is range 0 .. 1_000;
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 function Hash (F : Unit_Name_Type) return Header_Num;
kono
parents:
diff changeset
81 -- Function used to compute hash of unit name
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 No_Entry : constant Int := -1;
kono
parents:
diff changeset
84 -- Signals no entry in following table
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 package Unit_Hash_Table is new GNAT.HTable.Simple_HTable (
kono
parents:
diff changeset
87 Header_Num => Header_Num,
kono
parents:
diff changeset
88 Element => Int,
kono
parents:
diff changeset
89 No_Element => No_Entry,
kono
parents:
diff changeset
90 Key => Unit_Name_Type,
kono
parents:
diff changeset
91 Hash => Hash,
kono
parents:
diff changeset
92 Equal => "=");
kono
parents:
diff changeset
93 -- Hash table to map unit names to file names. Used in conjunction with
kono
parents:
diff changeset
94 -- table File_Mapping above.
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 function Hash (F : File_Name_Type) return Header_Num;
kono
parents:
diff changeset
97 -- Function used to compute hash of file name
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 package File_Hash_Table is new GNAT.HTable.Simple_HTable (
kono
parents:
diff changeset
100 Header_Num => Header_Num,
kono
parents:
diff changeset
101 Element => Int,
kono
parents:
diff changeset
102 No_Element => No_Entry,
kono
parents:
diff changeset
103 Key => File_Name_Type,
kono
parents:
diff changeset
104 Hash => Hash,
kono
parents:
diff changeset
105 Equal => "=");
kono
parents:
diff changeset
106 -- Hash table to map file names to path names. Used in conjunction with
kono
parents:
diff changeset
107 -- table Path_Mapping above.
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 Last_In_Table : Int := 0;
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 package Forbidden_Names is new GNAT.HTable.Simple_HTable (
kono
parents:
diff changeset
112 Header_Num => Header_Num,
kono
parents:
diff changeset
113 Element => Boolean,
kono
parents:
diff changeset
114 No_Element => False,
kono
parents:
diff changeset
115 Key => File_Name_Type,
kono
parents:
diff changeset
116 Hash => Hash,
kono
parents:
diff changeset
117 Equal => "=");
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 -----------------------------
kono
parents:
diff changeset
120 -- Add_Forbidden_File_Name --
kono
parents:
diff changeset
121 -----------------------------
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 procedure Add_Forbidden_File_Name (Name : File_Name_Type) is
kono
parents:
diff changeset
124 begin
kono
parents:
diff changeset
125 Forbidden_Names.Set (Name, True);
kono
parents:
diff changeset
126 end Add_Forbidden_File_Name;
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 ---------------------
kono
parents:
diff changeset
129 -- Add_To_File_Map --
kono
parents:
diff changeset
130 ---------------------
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 procedure Add_To_File_Map
kono
parents:
diff changeset
133 (Unit_Name : Unit_Name_Type;
kono
parents:
diff changeset
134 File_Name : File_Name_Type;
kono
parents:
diff changeset
135 Path_Name : File_Name_Type)
kono
parents:
diff changeset
136 is
kono
parents:
diff changeset
137 Unit_Entry : constant Int := Unit_Hash_Table.Get (Unit_Name);
kono
parents:
diff changeset
138 File_Entry : constant Int := File_Hash_Table.Get (File_Name);
kono
parents:
diff changeset
139 begin
kono
parents:
diff changeset
140 if Unit_Entry = No_Entry or else
kono
parents:
diff changeset
141 File_Mapping.Table (Unit_Entry).Fname /= File_Name
kono
parents:
diff changeset
142 then
kono
parents:
diff changeset
143 File_Mapping.Increment_Last;
kono
parents:
diff changeset
144 Unit_Hash_Table.Set (Unit_Name, File_Mapping.Last);
kono
parents:
diff changeset
145 File_Mapping.Table (File_Mapping.Last) :=
kono
parents:
diff changeset
146 (Uname => Unit_Name, Fname => File_Name);
kono
parents:
diff changeset
147 end if;
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 if File_Entry = No_Entry or else
kono
parents:
diff changeset
150 Path_Mapping.Table (File_Entry).Fname /= Path_Name
kono
parents:
diff changeset
151 then
kono
parents:
diff changeset
152 Path_Mapping.Increment_Last;
kono
parents:
diff changeset
153 File_Hash_Table.Set (File_Name, Path_Mapping.Last);
kono
parents:
diff changeset
154 Path_Mapping.Table (Path_Mapping.Last) :=
kono
parents:
diff changeset
155 (Uname => Unit_Name, Fname => Path_Name);
kono
parents:
diff changeset
156 end if;
kono
parents:
diff changeset
157 end Add_To_File_Map;
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 ----------
kono
parents:
diff changeset
160 -- Hash --
kono
parents:
diff changeset
161 ----------
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 function Hash (F : File_Name_Type) return Header_Num is
kono
parents:
diff changeset
164 begin
kono
parents:
diff changeset
165 return Header_Num (Int (F) rem Header_Num'Range_Length);
kono
parents:
diff changeset
166 end Hash;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 function Hash (F : Unit_Name_Type) return Header_Num is
kono
parents:
diff changeset
169 begin
kono
parents:
diff changeset
170 return Header_Num (Int (F) rem Header_Num'Range_Length);
kono
parents:
diff changeset
171 end Hash;
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 ----------------
kono
parents:
diff changeset
174 -- Initialize --
kono
parents:
diff changeset
175 ----------------
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 procedure Initialize (File_Name : String) is
kono
parents:
diff changeset
178 FD : File_Descriptor;
kono
parents:
diff changeset
179 Src : Source_Buffer_Ptr;
kono
parents:
diff changeset
180 Hi : Source_Ptr;
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 First : Source_Ptr := 1;
kono
parents:
diff changeset
183 Last : Source_Ptr := 0;
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 Uname : Unit_Name_Type;
kono
parents:
diff changeset
186 Fname : File_Name_Type;
kono
parents:
diff changeset
187 Pname : File_Name_Type;
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 procedure Empty_Tables;
kono
parents:
diff changeset
190 -- Remove all entries in case of incorrect mapping file
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 function Find_File_Name return File_Name_Type;
kono
parents:
diff changeset
193 -- Return Error_File_Name if the name buffer contains "/", otherwise
kono
parents:
diff changeset
194 -- call Name_Find. "/" is the path name in the mapping file to indicate
kono
parents:
diff changeset
195 -- that a source has been suppressed, and thus should not be found by
kono
parents:
diff changeset
196 -- the compiler.
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 function Find_Unit_Name return Unit_Name_Type;
kono
parents:
diff changeset
199 -- Return the unit name in the name buffer. Return Error_Unit_Name if
kono
parents:
diff changeset
200 -- the name buffer contains "/".
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 procedure Get_Line;
kono
parents:
diff changeset
203 -- Get a line from the mapping file, where a line is Src (First .. Last)
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 procedure Report_Truncated;
kono
parents:
diff changeset
206 -- Report a warning when the mapping file is truncated
kono
parents:
diff changeset
207 -- (number of lines is not a multiple of 3).
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 ------------------
kono
parents:
diff changeset
210 -- Empty_Tables --
kono
parents:
diff changeset
211 ------------------
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 procedure Empty_Tables is
kono
parents:
diff changeset
214 begin
kono
parents:
diff changeset
215 Unit_Hash_Table.Reset;
kono
parents:
diff changeset
216 File_Hash_Table.Reset;
kono
parents:
diff changeset
217 Path_Mapping.Set_Last (0);
kono
parents:
diff changeset
218 File_Mapping.Set_Last (0);
kono
parents:
diff changeset
219 Last_In_Table := 0;
kono
parents:
diff changeset
220 end Empty_Tables;
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 --------------------
kono
parents:
diff changeset
223 -- Find_File_Name --
kono
parents:
diff changeset
224 --------------------
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 function Find_File_Name return File_Name_Type is
kono
parents:
diff changeset
227 begin
kono
parents:
diff changeset
228 if Name_Buffer (1 .. Name_Len) = "/" then
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 -- A path name of "/" is the indication that the source has been
kono
parents:
diff changeset
231 -- "suppressed". Return Error_File_Name so that the compiler does
kono
parents:
diff changeset
232 -- not find the source, even if it is in the include path.
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 return Error_File_Name;
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 else
kono
parents:
diff changeset
237 return Name_Find;
kono
parents:
diff changeset
238 end if;
kono
parents:
diff changeset
239 end Find_File_Name;
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 --------------------
kono
parents:
diff changeset
242 -- Find_Unit_Name --
kono
parents:
diff changeset
243 --------------------
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 function Find_Unit_Name return Unit_Name_Type is
kono
parents:
diff changeset
246 begin
kono
parents:
diff changeset
247 return Unit_Name_Type (Find_File_Name);
kono
parents:
diff changeset
248 end Find_Unit_Name;
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 --------------
kono
parents:
diff changeset
251 -- Get_Line --
kono
parents:
diff changeset
252 --------------
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 procedure Get_Line is
kono
parents:
diff changeset
255 use ASCII;
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 begin
kono
parents:
diff changeset
258 First := Last + 1;
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 -- If not at the end of file, skip the end of line
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 while First < Src'Last
kono
parents:
diff changeset
263 and then (Src (First) = CR
kono
parents:
diff changeset
264 or else Src (First) = LF
kono
parents:
diff changeset
265 or else Src (First) = EOF)
kono
parents:
diff changeset
266 loop
kono
parents:
diff changeset
267 First := First + 1;
kono
parents:
diff changeset
268 end loop;
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 -- If not at the end of file, find the end of this new line
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 if First < Src'Last and then Src (First) /= EOF then
kono
parents:
diff changeset
273 Last := First;
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 while Last < Src'Last
kono
parents:
diff changeset
276 and then Src (Last + 1) /= CR
kono
parents:
diff changeset
277 and then Src (Last + 1) /= LF
kono
parents:
diff changeset
278 and then Src (Last + 1) /= EOF
kono
parents:
diff changeset
279 loop
kono
parents:
diff changeset
280 Last := Last + 1;
kono
parents:
diff changeset
281 end loop;
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 end if;
kono
parents:
diff changeset
284 end Get_Line;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 ----------------------
kono
parents:
diff changeset
287 -- Report_Truncated --
kono
parents:
diff changeset
288 ----------------------
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 procedure Report_Truncated is
kono
parents:
diff changeset
291 begin
kono
parents:
diff changeset
292 Write_Str ("warning: mapping file """);
kono
parents:
diff changeset
293 Write_Str (File_Name);
kono
parents:
diff changeset
294 Write_Line (""" is truncated");
kono
parents:
diff changeset
295 end Report_Truncated;
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 -- Start of processing for Initialize
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 begin
kono
parents:
diff changeset
300 Empty_Tables;
kono
parents:
diff changeset
301 Read_Source_File (Name_Enter (File_Name), 1, Hi, Src, FD, Config);
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 if Null_Source_Buffer_Ptr (Src) then
kono
parents:
diff changeset
304 if FD = Null_FD then
kono
parents:
diff changeset
305 Write_Str ("warning: could not locate mapping file """);
kono
parents:
diff changeset
306 else
kono
parents:
diff changeset
307 Write_Str ("warning: no read access for mapping file """);
kono
parents:
diff changeset
308 end if;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 Write_Str (File_Name);
kono
parents:
diff changeset
311 Write_Line ("""");
kono
parents:
diff changeset
312 No_Mapping_File := True;
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 else
kono
parents:
diff changeset
315 loop
kono
parents:
diff changeset
316 -- Get the unit name
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 Get_Line;
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 -- Exit if end of file has been reached
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 exit when First > Last;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 if (Last < First + 2) or else (Src (Last - 1) /= '%')
kono
parents:
diff changeset
325 or else (Src (Last) /= 's' and then Src (Last) /= 'b')
kono
parents:
diff changeset
326 then
kono
parents:
diff changeset
327 Write_Line
kono
parents:
diff changeset
328 ("warning: mapping file """ & File_Name &
kono
parents:
diff changeset
329 """ is incorrectly formatted");
kono
parents:
diff changeset
330 Write_Line ("Line = """ & String (Src (First .. Last)) & '"');
kono
parents:
diff changeset
331 Empty_Tables;
kono
parents:
diff changeset
332 return;
kono
parents:
diff changeset
333 end if;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 Name_Len := Integer (Last - First + 1);
kono
parents:
diff changeset
336 Name_Buffer (1 .. Name_Len) := String (Src (First .. Last));
kono
parents:
diff changeset
337 Uname := Find_Unit_Name;
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 -- Get the file name
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 Get_Line;
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 -- If end of line has been reached, file is truncated
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 if First > Last then
kono
parents:
diff changeset
346 Report_Truncated;
kono
parents:
diff changeset
347 Empty_Tables;
kono
parents:
diff changeset
348 return;
kono
parents:
diff changeset
349 end if;
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 Name_Len := Integer (Last - First + 1);
kono
parents:
diff changeset
352 Name_Buffer (1 .. Name_Len) := String (Src (First .. Last));
kono
parents:
diff changeset
353 Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
kono
parents:
diff changeset
354 Fname := Find_File_Name;
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 -- Get the path name
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 Get_Line;
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 -- If end of line has been reached, file is truncated
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 if First > Last then
kono
parents:
diff changeset
363 Report_Truncated;
kono
parents:
diff changeset
364 Empty_Tables;
kono
parents:
diff changeset
365 return;
kono
parents:
diff changeset
366 end if;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 Name_Len := Integer (Last - First + 1);
kono
parents:
diff changeset
369 Name_Buffer (1 .. Name_Len) := String (Src (First .. Last));
kono
parents:
diff changeset
370 Pname := Find_File_Name;
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 -- Add the mappings for this unit name
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 Add_To_File_Map (Uname, Fname, Pname);
kono
parents:
diff changeset
375 end loop;
kono
parents:
diff changeset
376 end if;
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 -- Record the length of the two mapping tables
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 Last_In_Table := File_Mapping.Last;
kono
parents:
diff changeset
381 end Initialize;
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 ----------------------
kono
parents:
diff changeset
384 -- Mapped_File_Name --
kono
parents:
diff changeset
385 ----------------------
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 function Mapped_File_Name (Unit : Unit_Name_Type) return File_Name_Type is
kono
parents:
diff changeset
388 The_Index : constant Int := Unit_Hash_Table.Get (Unit);
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 begin
kono
parents:
diff changeset
391 if The_Index = No_Entry then
kono
parents:
diff changeset
392 return No_File;
kono
parents:
diff changeset
393 else
kono
parents:
diff changeset
394 return File_Mapping.Table (The_Index).Fname;
kono
parents:
diff changeset
395 end if;
kono
parents:
diff changeset
396 end Mapped_File_Name;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 ----------------------
kono
parents:
diff changeset
399 -- Mapped_Path_Name --
kono
parents:
diff changeset
400 ----------------------
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 function Mapped_Path_Name (File : File_Name_Type) return File_Name_Type is
kono
parents:
diff changeset
403 Index : Int := No_Entry;
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 begin
kono
parents:
diff changeset
406 if Forbidden_Names.Get (File) then
kono
parents:
diff changeset
407 return Error_File_Name;
kono
parents:
diff changeset
408 end if;
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 Index := File_Hash_Table.Get (File);
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 if Index = No_Entry then
kono
parents:
diff changeset
413 return No_File;
kono
parents:
diff changeset
414 else
kono
parents:
diff changeset
415 return Path_Mapping.Table (Index).Fname;
kono
parents:
diff changeset
416 end if;
kono
parents:
diff changeset
417 end Mapped_Path_Name;
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 ------------------
kono
parents:
diff changeset
420 -- Reset_Tables --
kono
parents:
diff changeset
421 ------------------
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 procedure Reset_Tables is
kono
parents:
diff changeset
424 begin
kono
parents:
diff changeset
425 File_Mapping.Init;
kono
parents:
diff changeset
426 Path_Mapping.Init;
kono
parents:
diff changeset
427 Unit_Hash_Table.Reset;
kono
parents:
diff changeset
428 File_Hash_Table.Reset;
kono
parents:
diff changeset
429 Forbidden_Names.Reset;
kono
parents:
diff changeset
430 Last_In_Table := 0;
kono
parents:
diff changeset
431 end Reset_Tables;
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 -------------------------
kono
parents:
diff changeset
434 -- Update_Mapping_File --
kono
parents:
diff changeset
435 -------------------------
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 procedure Update_Mapping_File (File_Name : String) is
kono
parents:
diff changeset
438 File : File_Descriptor;
kono
parents:
diff changeset
439 N_Bytes : Integer;
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 File_Entry : Int;
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 Status : Boolean;
kono
parents:
diff changeset
444 -- For the call to Close
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 procedure Put_Line (Name : Name_Id);
kono
parents:
diff changeset
447 -- Put Name as a line in the Mapping File
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 --------------
kono
parents:
diff changeset
450 -- Put_Line --
kono
parents:
diff changeset
451 --------------
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 procedure Put_Line (Name : Name_Id) is
kono
parents:
diff changeset
454 begin
kono
parents:
diff changeset
455 Get_Name_String (Name);
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 -- If the Buffer is full, write it to the file
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 if Buffer_Last + Name_Len + 1 > Buffer'Last then
kono
parents:
diff changeset
460 N_Bytes := Write (File, Buffer (1)'Address, Buffer_Last);
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 if N_Bytes < Buffer_Last then
kono
parents:
diff changeset
463 Fail ("disk full");
kono
parents:
diff changeset
464 end if;
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 Buffer_Last := 0;
kono
parents:
diff changeset
467 end if;
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 -- Add the line to the Buffer
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 Buffer (Buffer_Last + 1 .. Buffer_Last + Name_Len) :=
kono
parents:
diff changeset
472 Name_Buffer (1 .. Name_Len);
kono
parents:
diff changeset
473 Buffer_Last := Buffer_Last + Name_Len + 1;
kono
parents:
diff changeset
474 Buffer (Buffer_Last) := ASCII.LF;
kono
parents:
diff changeset
475 end Put_Line;
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 -- Start of processing for Update_Mapping_File
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 begin
kono
parents:
diff changeset
480 -- If the mapping file could not be read, then it will not be possible
kono
parents:
diff changeset
481 -- to update it.
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 if No_Mapping_File then
kono
parents:
diff changeset
484 return;
kono
parents:
diff changeset
485 end if;
kono
parents:
diff changeset
486 -- Only Update if there are new entries in the mappings
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 if Last_In_Table < File_Mapping.Last then
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 File := Open_Read_Write (Name => File_Name, Fmode => Binary);
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 if File /= Invalid_FD then
kono
parents:
diff changeset
493 if Last_In_Table > 0 then
kono
parents:
diff changeset
494 Lseek (File, 0, Seek_End);
kono
parents:
diff changeset
495 end if;
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 for Unit in Last_In_Table + 1 .. File_Mapping.Last loop
kono
parents:
diff changeset
498 Put_Line (Name_Id (File_Mapping.Table (Unit).Uname));
kono
parents:
diff changeset
499 Put_Line (Name_Id (File_Mapping.Table (Unit).Fname));
kono
parents:
diff changeset
500 File_Entry :=
kono
parents:
diff changeset
501 File_Hash_Table.Get (File_Mapping.Table (Unit).Fname);
kono
parents:
diff changeset
502 Put_Line (Name_Id (Path_Mapping.Table (File_Entry).Fname));
kono
parents:
diff changeset
503 end loop;
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 -- Before closing the file, write the buffer to the file. It is
kono
parents:
diff changeset
506 -- guaranteed that the Buffer is not empty, because Put_Line has
kono
parents:
diff changeset
507 -- been called at least 3 times, and after a call to Put_Line, the
kono
parents:
diff changeset
508 -- Buffer is not empty.
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 N_Bytes := Write (File, Buffer (1)'Address, Buffer_Last);
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 if N_Bytes < Buffer_Last then
kono
parents:
diff changeset
513 Fail ("disk full");
kono
parents:
diff changeset
514 end if;
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 Close (File, Status);
kono
parents:
diff changeset
517
kono
parents:
diff changeset
518 if not Status then
kono
parents:
diff changeset
519 Fail ("disk full");
kono
parents:
diff changeset
520 end if;
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 elsif not Quiet_Output then
kono
parents:
diff changeset
523 Write_Str ("warning: could not open mapping file """);
kono
parents:
diff changeset
524 Write_Str (File_Name);
kono
parents:
diff changeset
525 Write_Line (""" for update");
kono
parents:
diff changeset
526 end if;
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 end if;
kono
parents:
diff changeset
529 end Update_Mapping_File;
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 end Fmap;